@SR1s
2017-03-07T16:07:50.000000Z
字数 1971
阅读 3101
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);
}
@Override
protected 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
*/
@Override
protected void onRender(long ellapsedRealtime, double deltaTime) {
super.onRender(ellapsedRealtime, deltaTime);
// 每一帧都绕着Y轴旋转
mModel.rotate(Vector3.Axis.Y, 1.0);
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
//ignore
}
@Override
public void onTouchEvent(MotionEvent event) {
// ignore
}
}
在上一篇的基础上,重新生成了一个Renderer
,然后在初始化场景的时候,解析模型文件,这里我把模型文件放在了res/raw/
文件夹下,通过R.raw.xxx
引用它。
由于加载是同步的,加载的过程又涉及了IO操作,所以页面会卡一下,在实际项目中通常会采用在后台加载资源的方式进行优化,后续会提到这种优化方式。
从代码可以看到,整个过程很简单:加载 -> 解析 -> 得到解析后的模型对象 -> 添加到场景。
由于物体很大,所以这里使用setScale
方法对其进行了缩放。
最终效果如图。Gayhub地址