android实现3D地球转动组件,Rajawali3D基础教程-一个地球旋转的例子
转载此译文请注明出处。
这篇文章将帮助你在安卓中使用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基础教程-一个地球旋转的例子相关推荐
- android 开发桌面应用程序,安卓开发基础教程-Android多界面应用程序开发
开篇 本文阅读需10分钟,简单易上手,属于安卓开发教程的基础部分. 建议精读,深刻理解大意.多做实践.多写代码. 本文章由做全栈攻城狮原创首发. 同名公众号已开启,官网www.8z5.net. 本套教 ...
- Android声明式UI框架-Litho-初探——基础使用篇
初衷 Litho作为一个高性能的UI引擎,学习曲线还是比较高的,但是在国内能用的资料非常少(大部分都是相互复制的"Hello Word"教程),国外除了Litho自己的文档外,也没 ...
- Android声明式UI框架 Litho 初探——基础使用
初衷 Litho作为一个高性能的UI引擎,学习曲线还是比较高的,但是在国内能用的资料非常少(大部分都是相互复制的"Hello Word"教程),国外除了Litho自己的文档外,也没 ...
- Android零基础入门第2节:Android 系统架构和应用组件那些事
继上一期浅谈了Android的前世今生,这一期一起来大致回顾一下Android 系统架构和应用组件. 一.Android 系统架构 Android系统的底层建立在Linux系统之上,该平台由操作系统. ...
- Android程序开发0基础教程(一)
程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操作系统, ...
- 从 iOS 14 到 Android 12,桌面小组件是怎么「文艺复兴」的
本文转载自 极客公园 时尚界一直以来有一个著名的理论:在某一时代流行的时尚元素,在经过一段时间的沉寂之后,会被人们再次拿出来利用. 这便是「弗莱定律」,它解释了为什么在长期的历史中,为什么很多曾经时尚 ...
- android+3d引擎,基于Android系统3D引擎的设计与实现
摘要: 随着人们生活水平的提高与科学技术的高速发展,在嵌入式设备上开发3D应用程序将会成为亮点,把3D技术应用到Android产品中,会极大的提高产品的竞争力.而3D图形开发的过程中所涉及的知识相当广 ...
- [Android Pro] 由模块化到组件化(一)
cp from : https://blog.csdn.net/dd864140130/article/details/53645290 在Android SDK一文中,我们谈到模块化和组件化,现在我 ...
- Android开发精要2--Android组件模型解析
本文的主要内容如下: 2.1 基于Mashup的应用设计 2.2 界面组件Activity解析 2.3 服务组件Service解析 2.4 触发器组件BroadcastReceiver解析 2.5 数 ...
最新文章
- PHP语言 -- 数组
- 【计算理论】可判定性 ( 可判定性总结 )
- mysql lib 5.5.28_mysql5.5.28在Linux下的安装
- Process 执行shell 脚本
- java中异常注意的细节1
- 1到100的偶数之和是多少_新射雕群侠传之铁血丹心手游新侠客独孤求败全渠道上线 新玩法桃花岛开启...
- CCF201503-1 图像旋转
- 几个容器网络相关问题的分析和解决总结
- python定时器 是线程吗_定时器中断线程python
- 算法复习——割点(洛谷3388)
- SQL,C#查询Excel数据
- 相分离在聚集多价信号蛋白过程中的作用Phase transitions in the assembly of multivalent signalling proteins
- [转载] 七龙珠第一部——第061话 塔上的卡林神
- emule学习与分析二 上 建立连接过程分析
- 破解入门(八)-----算法分析与注册机编写
- Putty和Psftp管理linux主机
- VPP buffer不足
- 在主动要求涨工资这事上,不要学我!从第一份工资800开始说起
- Xcode 9中模拟器的位置
- 在word里打勾的方法
热门文章
- torch和torchvision对应版本(最新版,含有torchvision 0.13.0版本)
- exchange邮箱一直提示密码错误,密码是正确的,求大佬解答
- 抖音:资本、梦想与躁动荷尔蒙裹挟的世界
- OPPO R8107刷机包下载_OPPO R8107密码忘记了?点击进来搞定
- 手游开发-客户端那些事1
- unity如何用代码创建自已的logo
- kubernetes secret私密凭据
- Win 10 卡在登陆界面转圈
- 坯子库和suapp哪个好用_关于Sketchup插件安装使用,你应该知道的那些事
- 安卓古筝软件_新手如何自学乐器|零基础自学小提琴/吉他/电子琴/尤克里里/竖笛/电子鼓软件超详细测评+推荐...