[关闭]
@SR1s 2017-03-07T16:07:50.000000Z 字数 1971 阅读 3101

Rajawali3D 入门(二):使用Rajawali3D 导入并展示模型

Rajawali3D OpenGLES Android 3D


写在前面

官方示例是个动态壁纸的Demo,在Demo里解析.obj模型文件,并把模型展示出来。我把动态壁纸的部分省略了。一来是官方的教程对动态壁纸部分没做多少描述,二来是我对这块也不熟,第三则是不搞动态壁纸这块也不影响我们学习导入、展示3D模型。

Obj 模型文件

Obj文件是文本文件,用于存储模型相关的信息,定义了定点、纹理定点等信息的存储格式。通过解析模型文件,可以还原出设计师设计的3D模型(否则让我们手动一点点的拼模型,一定疯掉)。Obj 模型文件可以通过3D Max、Maya等设计工具生成。TF3DM这个网站可以下载到许多免费的3D模型文件。

加载并导入模型文件

Rajawali支持多种模型文件格式,如常见的Obj、3DSMax、STL、MD2等,并有对应的加载器,如LoaderOBJLoader3DSMaxLoaderSTLLoaderMD2等,这些加载器定义在org.rajawali3d.loader包下。

这里我们选择Obj模型文件做为示例:

  1. /**
  2. * 加载模型渲染器
  3. * @author SR1s
  4. */
  5. public class LoadObjModelRenderer extends Renderer {
  6. private static final String TAG = "LoadObjModelRenderer";
  7. private Object3D mModel;
  8. public LoadObjModelRenderer(Context context) {
  9. super(context);
  10. // 设置渲染帧率
  11. setFrameRate(60);
  12. }
  13. @Override
  14. protected void initScene() {
  15. // 生成光照
  16. DirectionalLight light = new DirectionalLight(1f, 0.2f, -1f);
  17. light.setColor(1f, 1f, 1f);
  18. light.setPower(2);
  19. // 把光照添加到场景中
  20. getCurrentScene().addLight(light);
  21. // 设置场景的背景为白色
  22. getCurrentScene().setBackgroundColor(0xffffffff);
  23. // 使用LoderOBJ 来加载OBJ 模型文件
  24. LoaderOBJ loader = new LoaderOBJ(this, R.raw.bb8);
  25. try {
  26. // 解析模型文件
  27. loader.parse();
  28. // 获取模型对象
  29. mModel = loader.getParsedObject();
  30. // 把模型添加到场景中去
  31. getCurrentScene().addChild(mModel);
  32. // 缩放模型,不然模型就太大了
  33. mModel.setScale(.01f);
  34. // 设置摄像头的位置
  35. getCurrentCamera().setZ(4.2f);
  36. } catch (Exception ex) {
  37. Log.w(TAG, "LoaderOBJ ERROR", ex);
  38. }
  39. }
  40. /**
  41. * 每一帧渲染的时候调用
  42. * @param ellapsedRealtime
  43. * @param deltaTime
  44. */
  45. @Override
  46. protected void onRender(long ellapsedRealtime, double deltaTime) {
  47. super.onRender(ellapsedRealtime, deltaTime);
  48. // 每一帧都绕着Y轴旋转
  49. mModel.rotate(Vector3.Axis.Y, 1.0);
  50. }
  51. @Override
  52. public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
  53. //ignore
  54. }
  55. @Override
  56. public void onTouchEvent(MotionEvent event) {
  57. // ignore
  58. }
  59. }

在上一篇的基础上,重新生成了一个Renderer,然后在初始化场景的时候,解析模型文件,这里我把模型文件放在了res/raw/文件夹下,通过R.raw.xxx引用它。

由于加载是同步的,加载的过程又涉及了IO操作,所以页面会卡一下,在实际项目中通常会采用在后台加载资源的方式进行优化,后续会提到这种优化方式。

从代码可以看到,整个过程很简单:加载 -> 解析 -> 得到解析后的模型对象 -> 添加到场景。

由于物体很大,所以这里使用setScale方法对其进行了缩放。

最终效果如图。Gayhub地址

参考资料

Creating a Live Wallpaper and Importing a Model

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注