@SR1s
2017-03-07T08:07:50.000000Z
字数 1971
阅读 3707
Rajawali3D OpenGLES Android 3D
官方示例是个动态壁纸的Demo,在Demo里解析.obj模型文件,并把模型展示出来。我把动态壁纸的部分省略了。一来是官方的教程对动态壁纸部分没做多少描述,二来是我对这块也不熟,第三则是不搞动态壁纸这块也不影响我们学习导入、展示3D模型。
Obj文件是文本文件,用于存储模型相关的信息,定义了定点、纹理定点等信息的存储格式。通过解析模型文件,可以还原出设计师设计的3D模型(否则让我们手动一点点的拼模型,一定疯掉)。Obj 模型文件可以通过3D Max、Maya等设计工具生成。TF3DM这个网站可以下载到许多免费的3D模型文件。
Rajawali支持多种模型文件格式,如常见的Obj、3DSMax、STL、MD2等,并有对应的加载器,如LoaderOBJ、Loader3DSMax、LoaderSTL、LoaderMD2等,这些加载器定义在org.rajawali3d.loader包下。
这里我们选择Obj模型文件做为示例:
/*** 加载模型渲染器* @author SR1s*/public class LoadObjModelRenderer extends Renderer {private static final String TAG = "LoadObjModelRenderer";private Object3D mModel;public LoadObjModelRenderer(Context context) {super(context);// 设置渲染帧率setFrameRate(60);}@Overrideprotected void initScene() {// 生成光照DirectionalLight light = new DirectionalLight(1f, 0.2f, -1f);light.setColor(1f, 1f, 1f);light.setPower(2);// 把光照添加到场景中getCurrentScene().addLight(light);// 设置场景的背景为白色getCurrentScene().setBackgroundColor(0xffffffff);// 使用LoderOBJ 来加载OBJ 模型文件LoaderOBJ loader = new LoaderOBJ(this, R.raw.bb8);try {// 解析模型文件loader.parse();// 获取模型对象mModel = loader.getParsedObject();// 把模型添加到场景中去getCurrentScene().addChild(mModel);// 缩放模型,不然模型就太大了mModel.setScale(.01f);// 设置摄像头的位置getCurrentCamera().setZ(4.2f);} catch (Exception ex) {Log.w(TAG, "LoaderOBJ ERROR", ex);}}/*** 每一帧渲染的时候调用* @param ellapsedRealtime* @param deltaTime*/@Overrideprotected void onRender(long ellapsedRealtime, double deltaTime) {super.onRender(ellapsedRealtime, deltaTime);// 每一帧都绕着Y轴旋转mModel.rotate(Vector3.Axis.Y, 1.0);}@Overridepublic void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {//ignore}@Overridepublic void onTouchEvent(MotionEvent event) {// ignore}}
在上一篇的基础上,重新生成了一个Renderer,然后在初始化场景的时候,解析模型文件,这里我把模型文件放在了res/raw/文件夹下,通过R.raw.xxx引用它。
由于加载是同步的,加载的过程又涉及了IO操作,所以页面会卡一下,在实际项目中通常会采用在后台加载资源的方式进行优化,后续会提到这种优化方式。
从代码可以看到,整个过程很简单:加载 -> 解析 -> 得到解析后的模型对象 -> 添加到场景。
由于物体很大,所以这里使用setScale方法对其进行了缩放。
最终效果如图。Gayhub地址
