@SR1s
2017-03-06T03:29:56.000000Z
字数 3389
阅读 4354
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
dependencies {// 省略其他的依赖// 添加rajawali依赖,jcenter上最新版本为1.1.777compile 'org.rajawali3d:rajawali:1.1.777@aar'}
点击右上角的Sync Now,片刻后即可搞定。

这个示例要实现的效果如上,是一个不断转动着的地球(世界)。
整个实现很简单,总共只有两个类:
1. MainActivity: 配置并展示效果
2. SetUpRenderer: 实现模型的搭建、渲染和移动。
直接上代码吧,注释写得很清楚。
/*** MainActivity.java*/public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 创建一个用于展示的SurfaceView,注意这个SurfaceView的包名是org.rajawali3d.viewfinal SurfaceView surface = new SurfaceView(this);// 渲染帧率surface.setFrameRate(60);// 渲染模式:仅在需要更新界面的时候渲染surface.setRenderMode(ISurface.RENDERMODE_WHEN_DIRTY);// 把用于显示的SurfaceView放到界面上setContentView(surface);// 创建渲染器Renderer renderer = new SetUpRenderer(this);// 把渲染器设置给Surface,后续Surface就会使用它来绘制界面surface.setSurfaceRenderer(renderer);}}
/*** SetUpRenderer.java* 注意,这个Renderer的包名是org.rajawali3d.renderer*/public class SetUpRenderer extends Renderer {private static final String TAG = "SetUpRenderer";private DirectionalLight mDirectionalLight;private Sphere mEarthSphere;public SetUpRenderer(Context context) {super(context);// 设置渲染帧率setFrameRate(60);}/*** 这里进行场景的初始化操作*/@Overrideprotected void initScene() {// 生成光照mDirectionalLight = new DirectionalLight(1f, 0.2f, -1f);mDirectionalLight.setColor(1f, 1f, 1f);mDirectionalLight.setPower(2);// 把光照添加到场景中getCurrentScene().addLight(mDirectionalLight);// 创建材质Material material = new Material();material.enableLighting(true);material.setDiffuseMethod(new DiffuseMethod.Lambert());material.setColor(0);// 纹理素材Texture earthTexture = new Texture("Earth", R.drawable.earthtruecolor_nasa_big);try {// 为材质添加纹理material.addTexture(earthTexture);} catch (ATexture.TextureException ex) {Log.w(TAG, "TEXTURE ERROR", ex);}// 创建一个球体,即地球mEarthSphere = new Sphere(1, 24, 24);// 给地球的表面添加材质mEarthSphere.setMaterial(material);// 把球体加到场景里getCurrentScene().addChild(mEarthSphere);// 设置摄像头的位置getCurrentCamera().setZ(4.2f);}/*** 每一帧渲染的时候调用* @param ellapsedRealtime* @param deltaTime*/@Overrideprotected void onRender(long ellapsedRealtime, double deltaTime) {super.onRender(ellapsedRealtime, deltaTime);mEarthSphere.rotate(Vector3.Axis.Y, 1.0);}@Overridepublic void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {// 先忽略}@Overridepublic void onTouchEvent(MotionEvent event) {// 先忽略}}
说一下一些要点:
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版本里的对应的类了。后续如果还有变动,请记得联系我更新。