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

英文原文:http://www.clintonmedbery.com/?p=59

转载此译文请注明出处。

RajawaliBasicProject

这篇文章将帮助你在安卓中使用Rajawali 3D库实现一个基本的3D场景。关于最新版本的教程不是很多,有一些改动是需要注意的。

在过去,Rajawali是在一个activity子类和fragment子类中渲染3D和2D场景。自从上一个官方版本0.9的发布之后,Rajawali是使用RajawaliSurfaceViewRajawaliTextureView 为用户显示渲染结果。

如果你对我说的感到不知所云,那也没关系,这篇教程就是假设你了解不多。

开始项目

我们先来创建项目。打开Android Studio然后点击**“New Project….”,工程项目取名为“RajawaliBasicProject”**。

http://i0.wp.com/www.clintonmedbery.com/wp-content/uploads/2015/04/Screen-Shot-2015-04-06-at-11.56.15-AM.png

下一步我们直接选择默认的Android版本然后选择**“Blank Activity”作为我们的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所在的目录中创建一个新的类:

1433408793180475.png

类命名为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找到地球纹理的素材。在我们的场景中添加SphereDirectionLight对象。

private DirectionalLight directionalLight;
private Sphere earthSphere;

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

Screen-Shot-2015-04-06-at-1.10.16-PM.png

现在你可以将图片拖进这个文件夹了。如果你无法看到这个新建的目录(我在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");
        }

首先我们创建了一个叫materialMaterial对象。我们在它上面启用了lighting并给了它一个Diffuse的material类型(material类型不在本文的讨论范围),然后设置了它的颜色。

接着我们创建了一个叫做textureTexture对象,并且把地球照片传给它。然后我们在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

好了,运行项目看看效果:

1433409942317832.png

地球应该是旋转的,如果没有,欢迎在这里或者the Rajawali Google+ community上提问。

还可以在Github上下载项目的代码,直接导入就能运行:

RajawaliBasicProject