Libgdx New 3D API 教程之 -- 使用Libgdx加载模型
2014-12-05 16:43
531 查看
http://bbs.9ria.com/thread-221701-1-1.html
在前面的教程中,我们已经看到如何设置libgdx渲染3D场景。我们已经设置了Camera,增加了一些灯光并渲染一个绿色的盒子。现在让我们添加一个比盒子更有趣的东西,模型Model。
您可以从您喜爱的建模应用程序或使用已有的模型。我找了gdx-invaders里面的飞船模型文件,你可以点这里下载。您可以解压缩后,将文件放到的android项目的assets目录下。请注意,它包含三个文件,这些文件需要放同一个文件夹中:
现在让我们修改Basic3DTest,用模型替代原本的方盒子:
public class Basic3DTest implements ApplicationListener {
...
@Override
public void create () {
modelBatch = new ModelBatch();
lights = new Lights();
lights.ambientLight.set(0.4f, 0.4f, 0.4f, 1f);
lights.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(1f, 1f, 1f);
cam.lookAt(0,0,0);
cam.near = 0.1f;
cam.far = 300f;
cam.update();
ModelLoader loader = new ObjLoader();
model = loader.loadModel(Gdx.files.internal("data/ship.obj"));
instance = new ModelInstance(model);
camController = new CameraInputController(cam);
Gdx.input.setInputProcessor(camController);
}
...
}
复制代码
只有一点点改动,首先,camera离原点更近了,因为这飞船太小,然后,我们删掉了ModelBuilder,新建了一个ModelLoader,通过这个Loader,加载了一个模型飞船。结果就像下面这样:
<ignore_js_op>
2013-6-27 18:15:50 上传
下载附件 (84.89 KB)
这么做,测试的时候是没什么问题的,可是大型应用中,你将需要AssetManager去管理模型文件。下面,我们来添加:
public class Basic3DTest implements ApplicationListener {
public PerspectiveCamera cam;
public CameraInputController camController;
public ModelBatch modelBatch;
public AssetManager assets;
public Array<ModelInstance> instances = new Array<ModelInstance>();
public Lights lights;
public boolean loading;
@Override
public void create () {
modelBatch = new ModelBatch();
lights = new Lights();
lights.ambientLight.set(0.4f, 0.4f, 0.4f, 1f);
lights.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(1f, 1f, 1f);
cam.lookAt(0,0,0);
cam.near = 0.1f;
cam.far = 300f;
cam.update();
camController = new CameraInputController(cam);
Gdx.input.setInputProcessor(camController);
assets = new AssetManager();
assets.load("data/ship.obj", Model.class);
loading = true;
}
private void doneLoading() {
Model ship = assets.get("data/ship.obj", Model.class);
ModelInstance shipInstance = new ModelInstance(ship);
instances.add(shipInstance);
loading = false;
}
@Override
public void render () {
if (loading && assets.update())
doneLoading();
camController.update();
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
modelBatch.begin(cam);
for (ModelInstance instance : instances)
modelBatch.render(instance, lights);
modelBatch.end();
}
@Override
public void dispose () {
modelBatch.dispose();
instances.clear();
assets.dispose();
}
public boolean needsGL20 () {
return true;
}
public void resume () {
}
public void resize (int width, int height) {
}
public void pause () {
}
}
复制代码
过一遍都有哪些改动,去掉了Model instance,创建了AssetManager, 我们没有再使用单个的ModelInstance对象,而新建了一个数组,以便渲染多个实例,看起来更帖近实际。我们还添加了一个flag,标记加载是否正在进行。
现在,在Create方法中,我们创建一个asset manager, 并通过他加载飞船的模型文件。紧接着,我们设置了loading flag,通过它,我们就可以得知,需要更新assetmanager,来取得资源加载状态。在render方法中,我们读取loading flag的值,如果为 true,就说明asset manager正在加载资源,那我们需要调用assets.update(),如果返回的true,则加载结束,调用doneLoading()。同样在render方法里,我们渲染所有instance数组中的对象,而不是仅仅某一个。如果资源没加载成功,这个数组就为空。
新的方法doneLoading()得到我们刚刚加载的 ship 模型,创建一个名为shipInstance的modelInstance,并把它添加到的instances数组,使得它被渲染。最后,我们需要设置加载标志设置为false,这之后render中,assets.update()将不再被调用。
如果你运行这个,你会看到跟以前一样画面。并且,你会在看到飞船前,看到黑屏,这是通过asset manager异步加载模型造成的。
我们的程序支持多个model instances, 所以我们改成下面这样。
public class Basic3DTest implements ApplicationListener {
...
@Override
public void create () {
...
cam.position.set(7f, 7f, 7f);
...
}
private void doneLoading() {
Model ship = assets.get("data/ship.obj", Model.class);
for (float x = -5f; x <= 5f; x += 2f) {
for (float z = -5f; z <= 5f; z += 2f) {
ModelInstance shipInstance = new ModelInstance(ship);
shipInstance.transform.setToTranslation(x, 0, z);
instances.add(shipInstance);
}
}
loading = false;
}
...
}
复制代码
我们把相机又调远了些,这样可以在屏幕里,显示出所有的ship. 您可以通过鼠标滚轮来控制远近(放大,缩小)。在DoneLoading方法中,我们创建多个instance, 并放在一个基于x, z轴的网格中。
<ignore_js_op>
2013-6-27 18:15:49 上传
下载附件 (118.78 KB)
使用obj(wavefront)文件做测试还不错,可是现实应用中,就不太合适了,因为这种格式无法包函足够的信息去存储复杂的模型。而在Libgdx中,ObjLoader也就是为了测试用的,没太多也许是你想要的功能。
幸运的是,我们有:FBX-CONV,可以将建模软件生成的模型文件转成libgdx可识别的格式。名字可以有点误导,fbx-conv可以转化包括fbx在内的很多格式,(包括obj),FBX是首选的文件格式,因为几乎所有的建模程序都支持它。
获取fbx-conv的运行程序,如果你还没有,你可下载源码,或下载windows版的,点击下载(应该不是最新的)。fbx-conv可以生成两种格式,g3dj(json,用于debugging)&g3db(二进制,发布程序时用,因为更小,并且加载更快)。
命令运行如下:
fbx-conv ship.obj
复制代码
确保其他文件都在同一目录下,它将为您生成一个名为 ship.g3db 的文件。我们在程序中用一下:
public class Basic3DTest implements ApplicationListener {
...
@Override
public void create () {
...
assets.load("data/ship.g3db", Model.class);
...
}
private void doneLoading() {
Model ship = assets.get("data/ship.g3db", Model.class);
...
}
...
}
复制代码
原文地址:http://blog.csdn.net/q26335804/article/details/8994401
在前面的教程中,我们已经看到如何设置libgdx渲染3D场景。我们已经设置了Camera,增加了一些灯光并渲染一个绿色的盒子。现在让我们添加一个比盒子更有趣的东西,模型Model。
您可以从您喜爱的建模应用程序或使用已有的模型。我找了gdx-invaders里面的飞船模型文件,你可以点这里下载。您可以解压缩后,将文件放到的android项目的assets目录下。请注意,它包含三个文件,这些文件需要放同一个文件夹中:
ship.obj:我们要加载的wavefront模型文件
ship.mtl:wavefront模型文件使用的material文件
ship.png:纹理文件
ship.mtl:wavefront模型文件使用的material文件
ship.png:纹理文件
现在让我们修改Basic3DTest,用模型替代原本的方盒子:
public class Basic3DTest implements ApplicationListener {
...
@Override
public void create () {
modelBatch = new ModelBatch();
lights = new Lights();
lights.ambientLight.set(0.4f, 0.4f, 0.4f, 1f);
lights.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(1f, 1f, 1f);
cam.lookAt(0,0,0);
cam.near = 0.1f;
cam.far = 300f;
cam.update();
ModelLoader loader = new ObjLoader();
model = loader.loadModel(Gdx.files.internal("data/ship.obj"));
instance = new ModelInstance(model);
camController = new CameraInputController(cam);
Gdx.input.setInputProcessor(camController);
}
...
}
复制代码
只有一点点改动,首先,camera离原点更近了,因为这飞船太小,然后,我们删掉了ModelBuilder,新建了一个ModelLoader,通过这个Loader,加载了一个模型飞船。结果就像下面这样:
<ignore_js_op>
2013-6-27 18:15:50 上传
下载附件 (84.89 KB)
这么做,测试的时候是没什么问题的,可是大型应用中,你将需要AssetManager去管理模型文件。下面,我们来添加:
public class Basic3DTest implements ApplicationListener {
public PerspectiveCamera cam;
public CameraInputController camController;
public ModelBatch modelBatch;
public AssetManager assets;
public Array<ModelInstance> instances = new Array<ModelInstance>();
public Lights lights;
public boolean loading;
@Override
public void create () {
modelBatch = new ModelBatch();
lights = new Lights();
lights.ambientLight.set(0.4f, 0.4f, 0.4f, 1f);
lights.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(1f, 1f, 1f);
cam.lookAt(0,0,0);
cam.near = 0.1f;
cam.far = 300f;
cam.update();
camController = new CameraInputController(cam);
Gdx.input.setInputProcessor(camController);
assets = new AssetManager();
assets.load("data/ship.obj", Model.class);
loading = true;
}
private void doneLoading() {
Model ship = assets.get("data/ship.obj", Model.class);
ModelInstance shipInstance = new ModelInstance(ship);
instances.add(shipInstance);
loading = false;
}
@Override
public void render () {
if (loading && assets.update())
doneLoading();
camController.update();
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
modelBatch.begin(cam);
for (ModelInstance instance : instances)
modelBatch.render(instance, lights);
modelBatch.end();
}
@Override
public void dispose () {
modelBatch.dispose();
instances.clear();
assets.dispose();
}
public boolean needsGL20 () {
return true;
}
public void resume () {
}
public void resize (int width, int height) {
}
public void pause () {
}
}
复制代码
过一遍都有哪些改动,去掉了Model instance,创建了AssetManager, 我们没有再使用单个的ModelInstance对象,而新建了一个数组,以便渲染多个实例,看起来更帖近实际。我们还添加了一个flag,标记加载是否正在进行。
现在,在Create方法中,我们创建一个asset manager, 并通过他加载飞船的模型文件。紧接着,我们设置了loading flag,通过它,我们就可以得知,需要更新assetmanager,来取得资源加载状态。在render方法中,我们读取loading flag的值,如果为 true,就说明asset manager正在加载资源,那我们需要调用assets.update(),如果返回的true,则加载结束,调用doneLoading()。同样在render方法里,我们渲染所有instance数组中的对象,而不是仅仅某一个。如果资源没加载成功,这个数组就为空。
新的方法doneLoading()得到我们刚刚加载的 ship 模型,创建一个名为shipInstance的modelInstance,并把它添加到的instances数组,使得它被渲染。最后,我们需要设置加载标志设置为false,这之后render中,assets.update()将不再被调用。
如果你运行这个,你会看到跟以前一样画面。并且,你会在看到飞船前,看到黑屏,这是通过asset manager异步加载模型造成的。
我们的程序支持多个model instances, 所以我们改成下面这样。
public class Basic3DTest implements ApplicationListener {
...
@Override
public void create () {
...
cam.position.set(7f, 7f, 7f);
...
}
private void doneLoading() {
Model ship = assets.get("data/ship.obj", Model.class);
for (float x = -5f; x <= 5f; x += 2f) {
for (float z = -5f; z <= 5f; z += 2f) {
ModelInstance shipInstance = new ModelInstance(ship);
shipInstance.transform.setToTranslation(x, 0, z);
instances.add(shipInstance);
}
}
loading = false;
}
...
}
复制代码
我们把相机又调远了些,这样可以在屏幕里,显示出所有的ship. 您可以通过鼠标滚轮来控制远近(放大,缩小)。在DoneLoading方法中,我们创建多个instance, 并放在一个基于x, z轴的网格中。
<ignore_js_op>
2013-6-27 18:15:49 上传
下载附件 (118.78 KB)
使用obj(wavefront)文件做测试还不错,可是现实应用中,就不太合适了,因为这种格式无法包函足够的信息去存储复杂的模型。而在Libgdx中,ObjLoader也就是为了测试用的,没太多也许是你想要的功能。
幸运的是,我们有:FBX-CONV,可以将建模软件生成的模型文件转成libgdx可识别的格式。名字可以有点误导,fbx-conv可以转化包括fbx在内的很多格式,(包括obj),FBX是首选的文件格式,因为几乎所有的建模程序都支持它。
获取fbx-conv的运行程序,如果你还没有,你可下载源码,或下载windows版的,点击下载(应该不是最新的)。fbx-conv可以生成两种格式,g3dj(json,用于debugging)&g3db(二进制,发布程序时用,因为更小,并且加载更快)。
命令运行如下:
fbx-conv ship.obj
复制代码
确保其他文件都在同一目录下,它将为您生成一个名为 ship.g3db 的文件。我们在程序中用一下:
public class Basic3DTest implements ApplicationListener {
...
@Override
public void create () {
...
assets.load("data/ship.g3db", Model.class);
...
}
private void doneLoading() {
Model ship = assets.get("data/ship.g3db", Model.class);
...
}
...
}
复制代码
原文地址:http://blog.csdn.net/q26335804/article/details/8994401
相关文章推荐
- Libgdx New 3D API 教程之 -- 使用Libgdx加载模型
- Libgdx New 3D API 教程之 -- 使用Libgdx加载3D场景
- Libgdx New 3D API 教程之 -- Libgdx中使用Materials
- Libgdx New 3D API 教程之 -- Libgdx中使用Materials
- Libgdx New 3D API 教程之 -- 使用Libgdx创建Shader
- Libgdx New 3D API 教程之 -- 加载3D场景的背后-第二部分
- Libgdx New 3D API 教程之 -- Libgdx 3D 基础
- Libgdx New 3D API 教程之 -- 加载3D场景的背后-第二部分
- Libgdx New 3D API 教程之 -- 加载3D场景的背后-第一部分
- 使用Cesium.js加载3D模型
- Libgdx New 3D API 教程之 -- Libgdx中的3D frustum culling
- 使用Cesium.js加载3D模型
- [转]一步步使用3Dmax+Photoshop为游戏关卡设计瓦片化3D模型和无缝贴图(视频教程)
- OGRE 3D使用resources_d.cfg加载模型
- 3D模型的加载与使用
- [libGDX游戏开发教程]使用Libgdx进行游戏开发(5)-关卡加载
- 使用Cesium.js加载3D模型
- (更新视频教程)Tensorflow object detection API 搭建属于自己的物体识别模型(2)——训练并使用自己的模型
- libgdx 3D 从资源文件加载模型
- 使用Cesium.js加载3D模型