libgdx3D第一讲-基础教程

第一讲 基础教程

Basic 3D using LibGDX

网易云地址:http://note.youdao.com/share/?id=442771fd5cc6ce8cf9fd30b838a76343&type=note
说明:我是从网易云笔记直接粘过来的,可能图片显示不出来,附加资源下载不了,所以可以直接访问上面的地址来看。

  • 开卷语:
      我最近才开始学习游戏编程,因为想做个网游玩,所以前几天找了不少引擎来看,于是不出意料的选中了libgdx,值得感谢的是libgdx的文档很多很全, 所以没有走多少弯路就成功的配置好了环境。基础教程很完善,好多大神都已经写的很详细了,但是3D方面的很少见,所以我正好要学,索性直接翻译过来,大家 共同进步。注意:教程基本是从Wiki上翻译过来,外加自己的小部分理解,所以一般来说应该没什么问题,如有错误请多多指教。
  • 教程开始:
1.我们需要实现一个ApplicationListener来完成操作,如下:
public   class   Basic3DTest  implements   ApplicationListener {
     @Override
     public   void   create () {
     }
 
     @Override
     public   void   render () {
     }
     
     @Override
     public   void   dispose () {
     }
     
     @Override
     public   void   resume () {
     }
 
     @Override
     public   void   resize ( int   width,  int   height) {
     }
 
     @Override
     public   void   pause () {
     }
}

2.增加一个camera来允许我们以3D视角来透视我们的场景
public   class   Basic3DTest  implements   ApplicationListener {
     public   PerspectiveCamera cam;
 
     @Override
     public   void   create () {
         cam =  new   PerspectiveCamera( 67 , Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
         cam.position.set(10f, 10f, 10f);
         cam.lookAt( 0 , 0 , 0 );
         cam.near = 1f;
         cam.far = 300f;
         cam.update();
     }
...
}
我们建立了一个PerectiveCamera类,其属性为67度视角(常用视角),宽高为 Gdx.graphics预设值;并设camera在X,Y,Z(右,上,后)轴上的位置为10,其中Z轴指向观察者;设置远近值来确保能看到场景;最后使用update()方法来更新相机使我们能看到变化。

3.我们增加点物体
public   class   Basic3DTest  implements   ApplicationListener {
     public   PerspectiveCamera cam;
     public   Model model;
     public   ModelInstance instance;
 
     @Override
     public   void   create () {
         cam =  new   PerspectiveCamera( 67 , Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
         ...
         cam.update();
 
         ModelBuilder modelBuilder = new ModelBuilder();
        model = modelBuilder.createBox(5f, 5f, 5f,
            new Material(ColorAttribute.createDiffuse(Color.GREEN)),
            Usage.Position | Usage.Normal);
        instance = new ModelInstance(model);
     }
 
     @Override
     public   void   dispose () {
         model.dispose();
     }
...
}
在这里,我们实例化一个模型构建器   ModelBuilder,它可用于在代码中创建模型。然后我们建立了一个5*5*5的立方体,设置 Color绿色,设置位置 Usage.Position,设置 Usage.Normal (光线等)。Usage继承 VertexAttributes。
模型包含了如何渲染等很多工作,但是它不知道把自己放在哪里,所以我们需要建立ModelInstance。 ModelInstance包含需要被渲染的位置,旋转和缩放,默认情况下是( 0,0,0 ) ,所以我们只需要创建设置为(0,0,0)的ModelInstance 。

4. ModelBatch
public   class   Basic3DTest  implements   ApplicationListener {
     public   PerspectiveCamera cam;
     public   ModelBatch modelBatch;
     public   Model model;
     public   ModelInstance instance;
     
     @Override
     public   void   create () {
         modelBatch =  new   ModelBatch();
         
         cam =  new   PerspectiveCamera( 67 , Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
         ...
         cam.update();
 
         ModelBuilder modelBuilder =  new   ModelBuilder();
         model = modelBuilder.createBox(5f, 5f, 5f,
                 new   Material(ColorAttribute.createDiffuse(Color.GREEN)),
                 Usage.Position | Usage.Normal);
         instance =  new   ModelInstance(model);
     }
 
     @Override
     public   void   render () {
         Gdx.gl.glViewport( 0 0 , Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
 
         modelBatch.begin(cam);
         modelBatch.render(instance);
         modelBatch.end();
     }
     
     @Override
     public   void   dispose () {
         modelBatch.dispose();
         model.dispose();
     }
...
}
代码中增加了 ModelBatch用来渲染图像,在create()中初始化,在render()中clean,begin,render,end。记得在dispose中销毁它。效果如图:
basic3dtest1

5.现在加点光照
public   class   Basic3DTest  implements   ApplicationListener {
     public   Environment environment;
     ...
     
     @Override
     public   void   create () {
         environment =  new   Environment();
         environment.set( new   ColorAttribute(ColorAttribute.AmbientLight,  0 .4f,  0 .4f,  0 .4f, 1f));
         environment.add( new   DirectionalLight().set( 0 .8f,  0 .8f,  0 .8f, -1f, - 0 .8f, - 0 .2f));
         ...
     }
 
     @Override
     public   void   render () {
         Gdx.gl.glViewport( 0 0 , Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
 
         modelBatch.begin(cam);
         modelBatch.render(instance, environment);
         modelBatch.end();
     }
     ...
}
我们添加一个环境实例  Environment。我们构建并设置了环境光( 0.4 , 0.4 , 0.4 ) ,注意alpha值将被忽略。然后我们添加一个DirectionalLight为( 0.8 ,0.8, 0.8)的颜色和(-1.0 ,- 0.8F , 0.2)的方向。效果如图:

6.现在我们控制camera来从其他角度看模型
public   class   Basic3DTest  implements   ApplicationListener {
     ...
     public   CameraInputController camController;
     ...
     
     @Override
     public   void   create () {
         ...
         camController =  new   CameraInputController(cam);
         Gdx.input.setInputProcessor(camController);
     }
 
     @Override
     public   void   render () {
         camController.update();
         ...
     }
...
}
建立CameraInputController来增加相机控制,这样就可以拖动旋转了。

补充import文件,可能有同学会遇到这类问题
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.*;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g3d.*;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值