@SR1s
2017-03-06T11:29:56.000000Z
字数 3389
阅读 3806
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.777
compile 'org.rajawali3d:rajawali:1.1.777@aar'
}
点击右上角的Sync Now
,片刻后即可搞定。
这个示例要实现的效果如上,是一个不断转动着的地球(世界)。
整个实现很简单,总共只有两个类:
1. MainActivity: 配置并展示效果
2. SetUpRenderer: 实现模型的搭建、渲染和移动。
直接上代码吧,注释写得很清楚。
/**
* MainActivity.java
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 创建一个用于展示的SurfaceView,注意这个SurfaceView的包名是org.rajawali3d.view
final 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);
}
/**
* 这里进行场景的初始化操作
*/
@Override
protected 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
*/
@Override
protected void onRender(long ellapsedRealtime, double deltaTime) {
super.onRender(ellapsedRealtime, deltaTime);
mEarthSphere.rotate(Vector3.Axis.Y, 1.0);
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
// 先忽略
}
@Override
public 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
版本里的对应的类了。后续如果还有变动,请记得联系我更新。