[关闭]
@SR1s 2017-03-06T11:29:56.000000Z 字数 3389 阅读 3806

Rajawali3D 入门(一):Rajawali3D Android版基础

Rajawali3D OpenGLES Android 3D


写在前面

Rajawali3D 是一个3D图形引擎,可以用于构建展示3D场景。这个教程是从官方文档而来,但并非是简单地对官方的示例教程进行翻译。我会在自己实践的基础上有所改动。希望能给看这个系列的同行者一些帮助。

开始

作为这个系列的第一篇,照例是初学者喜爱的Hello world时间啦。第一篇是主要讲解如何创建项目、引入Rajawali3D 的依赖。OK,让我们进入正题。

创建项目

首先是创建项目。打开我们熟悉的Android Studio,如图

创建新项目

依次填写项目的信息,这里的项目名称我填的是“RajawaliTutorial”,公司域名填“me.sr1”(其实应该是sr1.me,不过无伤大雅,就这样的吧),如下图

至于最低支持的SDK版本,示例没必要支持那么低,就定为Android 5.0。

Activity选“Empty Activity”

这里不勾选创建布局文件的选项

然后惯例经过一段时间的等待,项目就创建完了。

引入依赖

添加依赖需要app模块下的build.gradle文件。虽然官方文档上说是要添加maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }mavenCentral()这两句在工程的build.gradle文件里,但在jcenter搜了下,能搜到Rajawali3D这个库,所以也就没必要添加上面那两句了。否则你会经历一段漫长的下载依赖的过程,目测sonatype的源被墙了,我在这个过程卡了好久T_T

  1. dependencies {
  2. // 省略其他的依赖
  3. // 添加rajawali依赖,jcenter上最新版本为1.1.777
  4. compile 'org.rajawali3d:rajawali:1.1.777@aar'
  5. }

点击右上角的Sync Now,片刻后即可搞定。

Hello world

实现效果

最终效果

这个示例要实现的效果如上,是一个不断转动着的地球(世界)。

实现思路

整个实现很简单,总共只有两个类:
1. MainActivity: 配置并展示效果
2. SetUpRenderer: 实现模型的搭建、渲染和移动。

直接上代码吧,注释写得很清楚。

  1. /**
  2. * MainActivity.java
  3. */
  4. public class MainActivity extends AppCompatActivity {
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. // 创建一个用于展示的SurfaceView,注意这个SurfaceView的包名是org.rajawali3d.view
  9. final SurfaceView surface = new SurfaceView(this);
  10. // 渲染帧率
  11. surface.setFrameRate(60);
  12. // 渲染模式:仅在需要更新界面的时候渲染
  13. surface.setRenderMode(ISurface.RENDERMODE_WHEN_DIRTY);
  14. // 把用于显示的SurfaceView放到界面上
  15. setContentView(surface);
  16. // 创建渲染器
  17. Renderer renderer = new SetUpRenderer(this);
  18. // 把渲染器设置给Surface,后续Surface就会使用它来绘制界面
  19. surface.setSurfaceRenderer(renderer);
  20. }
  21. }
  1. /**
  2. * SetUpRenderer.java
  3. * 注意,这个Renderer的包名是org.rajawali3d.renderer
  4. */
  5. public class SetUpRenderer extends Renderer {
  6. private static final String TAG = "SetUpRenderer";
  7. private DirectionalLight mDirectionalLight;
  8. private Sphere mEarthSphere;
  9. public SetUpRenderer(Context context) {
  10. super(context);
  11. // 设置渲染帧率
  12. setFrameRate(60);
  13. }
  14. /**
  15. * 这里进行场景的初始化操作
  16. */
  17. @Override
  18. protected void initScene() {
  19. // 生成光照
  20. mDirectionalLight = new DirectionalLight(1f, 0.2f, -1f);
  21. mDirectionalLight.setColor(1f, 1f, 1f);
  22. mDirectionalLight.setPower(2);
  23. // 把光照添加到场景中
  24. getCurrentScene().addLight(mDirectionalLight);
  25. // 创建材质
  26. Material material = new Material();
  27. material.enableLighting(true);
  28. material.setDiffuseMethod(new DiffuseMethod.Lambert());
  29. material.setColor(0);
  30. // 纹理素材
  31. Texture earthTexture = new Texture("Earth", R.drawable.earthtruecolor_nasa_big);
  32. try {
  33. // 为材质添加纹理
  34. material.addTexture(earthTexture);
  35. } catch (ATexture.TextureException ex) {
  36. Log.w(TAG, "TEXTURE ERROR", ex);
  37. }
  38. // 创建一个球体,即地球
  39. mEarthSphere = new Sphere(1, 24, 24);
  40. // 给地球的表面添加材质
  41. mEarthSphere.setMaterial(material);
  42. // 把球体加到场景里
  43. getCurrentScene().addChild(mEarthSphere);
  44. // 设置摄像头的位置
  45. getCurrentCamera().setZ(4.2f);
  46. }
  47. /**
  48. * 每一帧渲染的时候调用
  49. * @param ellapsedRealtime
  50. * @param deltaTime
  51. */
  52. @Override
  53. protected void onRender(long ellapsedRealtime, double deltaTime) {
  54. super.onRender(ellapsedRealtime, deltaTime);
  55. mEarthSphere.rotate(Vector3.Axis.Y, 1.0);
  56. }
  57. @Override
  58. public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
  59. // 先忽略
  60. }
  61. @Override
  62. public void onTouchEvent(MotionEvent event) {
  63. // 先忽略
  64. }
  65. }

说一下一些要点:
1. 渲染器用于渲染场景内容,需要继承于org.rajawali3d.renderer.Renderer
2. 3D场景需要有展示的地方,这个地方由SurfaceView提供,同样需要注意,这个SurfaceView的全称是org.rajawali3d.view.SurfaceView
3. 项目里给球体一张地球的贴图,贴图可以点这里下载。下载到的图片放在资源目录下的drawable-nodpi文件夹内

基本就是以上这些。可以看我的Github

参考资料

Basic Rajawali3D Tutorial for Android

后记

虽然看的是官方的资料,但不得不说官方的资料更新得太不及时了。原本的资料里使用的几个类,在1.1.777版本里已经换掉了,这里我都改成1.1.777版本里的对应的类了。后续如果还有变动,请记得联系我更新。

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