Rajawali3D基础教程-一个地球旋转的例子

来源:互联网 发布:手机同步翻译软件 编辑:程序博客网 时间:2024/05/05 14:15

转载于 http://www.android100.org/html/201510/05/187690.html

这里写图片描述

这篇文章将帮助你在安卓中使用Rajawali 3D库实现一个基本的3D场景。关于最新版本的教程不是很多,有一些改动是需要注意的。
在过去,Rajawali是在一个activity子类和fragment子类中渲染3D和2D场景。自从上一个官方版本0.9的发布之后,Rajawali是使用RajawaliSurfaceView 和 RajawaliTextureView 为用户显示渲染结果。
如果你对我说的感到不知所云,那也没关系,这篇教程就是假设你了解不多。

开始项目
我们先来创建项目。打开AndroidStudio然后点击“NewProject….”,工程项目取名为“RajawaliBasicProject”。
这里写图片描述

下一步我们直接选择默认的Android版本然后选择“BlankActivity”作为我们的Activity。我们直接采用“MainActivity”作为activity的名字。
从Maven上获得Rajawali然后添加到Android Studio项目中
使用Maven来将Rajawali添加到项目中。这对于最新版本的Rajawali是有效的,但也许你需要换成其他的版本。如果你没找到版本号,可以试试在github的RajawaliExamples项目的gradle中寻找 ,或者在他们维护的Maven package中寻找。
在build.gradle (Project: RajawaliBasicProject)文件中,我们需要新添加几行代码:

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {    repositories {        jcenter()        mavenCentral()    }    dependencies {        classpath 'com.android.tools.build:gradle:1.1.0'        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}allprojects {    repositories {        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }        jcenter()    }}

注意新加入的mavenCentral()和maven { url “https://oss.sonatype.org/content/repositories/snapshots/” }。这可以让Android Studio链接到Mave服务器获取一个library。
现在,我们需要在 build.gradle (Module: app)中添加一行代码:

dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile 'com.android.support:appcompat-v7:22.0.0'    compile 'org.rajawali3d:rajawali:1.0.186-SNAPSHOT@aar'}

设置我们的场景
我们将实现一个简单的地球旋转场景,和他们早先在github上的基础教程里面的效果类似,只不过使用了最新的代码。首先,我们需要继承Rajawali的Renderer类。
我们在MainActivity所在的目录中创建一个新的类:

类命名为Renderer,继承自RajawaliRenderer如下:
Android Studio会提示你实现一些接口。

package com.clintonmedbery.rajawalibasicproject;
import android.view.MotionEvent;
import org.rajawali3d.renderer.RajawaliRenderer;
public class Renderer extends RajawaliRenderer {
public void onTouchEvent(MotionEvent event){
}
public void onOffsetsChanged(float x, float y, float z, float w, int i, int j){
}
}

现在Android Studio可能会出现默认的构造函数和initScene()方法这样的提示。我们添加一个构造函数就可以去掉。我们还需要持有一个context,也一并添加。

public Context context;    public Renderer(Context context) {        super(context);        this.context = context;        setFrameRate(60);    }

接下来我们需要为场景添加一些变量并找一张照片。你可以使用任意的纹理素材,但是可以在here找到地球纹理的素材。在我们的场景中添加Sphere和DirectionLight对象。

private DirectionalLight directionalLight;
private Sphere earthSphere;

同时将纹理图片添加到项目中,右键res folder,点击New > Android Resource Directory,然后输入drawable-nodpi,如图所示:
这里写图片描述

现在你可以将图片拖进这个文件夹了。如果你无法看到这个新建的目录(我在mac上就没看到),你可能需要右键res文件夹点击 Reveal in Finder然后将文件复制进去。
现在我们开始准备构建我们的场景了。我们将在一个名叫initScene()的新方法中做这件事情。创建这个方法,并设置好lighting。

public void initScene(){

    directionalLight = new DirectionalLight(1f, .2f, -1.0f);    directionalLight.setColor(1.0f, 1.0f, 1.0f);    directionalLight.setPower(2);    getCurrentScene().addLight(directionalLight);}

这个方法将在renderer开始的时候被调用。我们创建了一个新的directionalLight,调整了颜色和力度值。然后把它添加到场景中。
下面,我们为Sphere设置material。这些代码在directionalLight相关代码的下面。

    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 error){        Log.d("DEBUG", "TEXTURE ERROR");    }

首先我们创建了一个叫material的Material对象。我们在它上面启用了lighting并给了它一个Diffuse的material类型(material类型不在本文的讨论范围),然后设置了它的颜色。
接着我们创建了一个叫做texture的Texture对象,并且把地球照片传给它。然后我们在try-catch代码块中把texture添加到material,以避免异常。现在material就准备好了。
最后,实例化我们的Sphere,并把刚刚创建的material传给它。把Sphere添加到场景中,然后设置camera back,这样就能看到场景了。
earthSphere = new Sphere(1, 24, 24);
earthSphere.setMaterial(material);
getCurrentScene().addChild(earthSphere);
getCurrentCamera().setZ(4.2f);

赋予场景动画
现在,我们在onRender方法中添加一个简单的动画到场景。这将让地球旋转起来。

@Override public void onRender(final long elapsedTime, final double deltaTime) {    super.onRender(elapsedTime, deltaTime);    earthSphere.rotate(Vector3.Axis.Y, 1.0);}

在MainActivity中渲染场景
以上就是为我们的简单场景所做的工作了,现在我们需要回到MainActivity,在那里渲染它。在activity中添加一个renderer对象,然后在onCreate中添加一些代码,这里是MainActivity前面部分需要的代码:

    Renderer renderer;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        final RajawaliSurfaceView surface = new RajawaliSurfaceView(this);        surface.setFrameRate(60.0);        surface.setRenderMode(IRajawaliSurface.RENDERMODE_WHEN_DIRTY);        // Add mSurface to your root view        addContentView(surface, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));        renderer = new Renderer(this);        surface.setSurfaceRenderer(renderer);    }

这里需要关注的主要是RajawaliSurfaceView。这个类继承自GLSurfaceView,可以把我们的Renderer添加到里面,然后让这个SurfaceView显示在我们的activity中。我们为surface设置了几个变量,同时实例化了Renderer场景,并添加到了surface。
好了,运行项目看看效果:
这里写图片描述

0 0