转载此译文请注明出处。

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

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

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

开始项目

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

下一步我们直接选择默认的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所在的目录中创建一个新的类:

类命名为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。

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

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

android实现3D地球转动组件,Rajawali3D基础教程-一个地球旋转的例子相关推荐

  1. android 开发桌面应用程序,安卓开发基础教程-Android多界面应用程序开发

    开篇 本文阅读需10分钟,简单易上手,属于安卓开发教程的基础部分. 建议精读,深刻理解大意.多做实践.多写代码. 本文章由做全栈攻城狮原创首发. 同名公众号已开启,官网www.8z5.net. 本套教 ...

  2. Android声明式UI框架-Litho-初探——基础使用篇

    初衷 Litho作为一个高性能的UI引擎,学习曲线还是比较高的,但是在国内能用的资料非常少(大部分都是相互复制的"Hello Word"教程),国外除了Litho自己的文档外,也没 ...

  3. Android声明式UI框架 Litho 初探——基础使用

    初衷 Litho作为一个高性能的UI引擎,学习曲线还是比较高的,但是在国内能用的资料非常少(大部分都是相互复制的"Hello Word"教程),国外除了Litho自己的文档外,也没 ...

  4. Android零基础入门第2节:Android 系统架构和应用组件那些事

    继上一期浅谈了Android的前世今生,这一期一起来大致回顾一下Android 系统架构和应用组件. 一.Android 系统架构 Android系统的底层建立在Linux系统之上,该平台由操作系统. ...

  5. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操作系统, ...

  6. 从 iOS 14 到 Android 12,桌面小组件是怎么「文艺复兴」的

    本文转载自 极客公园 时尚界一直以来有一个著名的理论:在某一时代流行的时尚元素,在经过一段时间的沉寂之后,会被人们再次拿出来利用. 这便是「弗莱定律」,它解释了为什么在长期的历史中,为什么很多曾经时尚 ...

  7. android+3d引擎,基于Android系统3D引擎的设计与实现

    摘要: 随着人们生活水平的提高与科学技术的高速发展,在嵌入式设备上开发3D应用程序将会成为亮点,把3D技术应用到Android产品中,会极大的提高产品的竞争力.而3D图形开发的过程中所涉及的知识相当广 ...

  8. [Android Pro] 由模块化到组件化(一)

    cp from : https://blog.csdn.net/dd864140130/article/details/53645290 在Android SDK一文中,我们谈到模块化和组件化,现在我 ...

  9. Android开发精要2--Android组件模型解析

    本文的主要内容如下: 2.1 基于Mashup的应用设计 2.2 界面组件Activity解析 2.3 服务组件Service解析 2.4 触发器组件BroadcastReceiver解析 2.5 数 ...

最新文章

  1. PHP语言 -- 数组
  2. 【计算理论】可判定性 ( 可判定性总结 )
  3. mysql lib 5.5.28_mysql5.5.28在Linux下的安装
  4. Process 执行shell 脚本
  5. java中异常注意的细节1
  6. 1到100的偶数之和是多少_新射雕群侠传之铁血丹心手游新侠客独孤求败全渠道上线 新玩法桃花岛开启...
  7. CCF201503-1 图像旋转
  8. 几个容器网络相关问题的分析和解决总结
  9. python定时器 是线程吗_定时器中断线程python
  10. 算法复习——割点(洛谷3388)
  11. SQL,C#查询Excel数据
  12. 相分离在聚集多价信号蛋白过程中的作用Phase transitions in the assembly of multivalent signalling proteins
  13. [转载] 七龙珠第一部——第061话 塔上的卡林神
  14. emule学习与分析二 上 建立连接过程分析
  15. 破解入门(八)-----算法分析与注册机编写
  16. Putty和Psftp管理linux主机
  17. VPP buffer不足
  18. 在主动要求涨工资这事上,不要学我!从第一份工资800开始说起
  19. Xcode 9中模拟器的位置
  20. 在word里打勾的方法

热门文章

  1. torch和torchvision对应版本(最新版,含有torchvision 0.13.0版本)
  2. exchange邮箱一直提示密码错误,密码是正确的,求大佬解答
  3. 抖音:资本、梦想与躁动荷尔蒙裹挟的世界
  4. OPPO R8107刷机包下载_OPPO R8107密码忘记了?点击进来搞定
  5. 手游开发-客户端那些事1
  6. unity如何用代码创建自已的logo
  7. kubernetes secret私密凭据
  8. Win 10 卡在登陆界面转圈
  9. 坯子库和suapp哪个好用_关于Sketchup插件安装使用,你应该知道的那些事
  10. 安卓古筝软件_新手如何自学乐器|零基础自学小提琴/吉他/电子琴/尤克里里/竖笛/电子鼓软件超详细测评+推荐...