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

泡在网上的日子 / 文 发表于2015-06-04 18:05 第次阅读 OpenGL,3D

英文原文: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:[email protected]'
}

设置我们的场景

我们将实现一个简单的地球旋转场景,和他们早先在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

收藏 赞 (0) 踩 (0)
上一篇:完全掌握Android Data Binding
本教程是跟着 Data Binding Guide 学习过程中得出的一些实践经验,同时修改了官方教程的一些错误,每一个知识点都有对应的源码,争取做到实践与理论相结合。 Data Binding 解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既
下一篇:Square:从今天开始抛弃Fragment吧!
原文链接 : Advocating Against Android Fragments 原文作者 : Pierre-Yves Ricau 译文出自 : 开发技术前线 www.devtf.cn 译者 : chaossss 最近我在 Droidcon Paris 上进行了 一个技术相关的演讲 ,我在这次演讲中给大家展示了 Square 使用 Fragment 进行开