我对Android开发很新,我知道基础活动,地图,sqlite等。 我希望能够实现一些3D对象,以便能够在我的应用程序中进行交互。经过一番搜索,我发现rajawali似乎是最好的方法。正如您所做的那样,我从第一篇教程开始,并从示例文档中读取源代码。 我迷失的地方是我逐字逐句地遵循了教程,由于脚本中的错误,我无法运行应用程序。如果有人使用Rajawali之前我会指出一些关于我哪里出错的指示。 (该教程最后更新于2个月前,因此它最近更新)。 Tutorial
这是我的源代码
MainActivity:
package rajawali.tutorials;
import rajawali.RajawaliActivity;
import android.os.Bundle;
import android.view.Menu;
public class MainActivity extends RajawaliActivity {
private Renderer mRenderer;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRenderer = new Renderer(this);
mRenderer.setSurfaceView(mSurfaceView);
super.setRenderer(mRenderer);
}
}
渲染器:
package rajawali.tutorials;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import rajawali.lights.DirectionalLight;
import rajawali.materials.textures.ATexture.TextureException;
import rajawali.materials.textures.Texture;
import rajawali.primitives.Sphere;
import rajawali.renderer.RajawaliRenderer;
public class Renderer extends RajawaliRenderer {
private DirectionalLight mLight;
Sphere mSphere;
public Renderer(Context context) {
super(context);
setFrameRate(60);
}
public void initScene() {
mLight = new DirectionalLight(1f, 0.2f, -1.0f);
mLight.setColor(1.0f, 1.0f, 1.0f);
mLight.setPower(2);
try {
*DiffuseMaterial* material = new *DiffuseMaterial*(); //there is an error here (DiffuseMaterial cannot be rsolved as a type)
material.addTexture(new *Texture(R.drawable.earthtruecolor_nasa_big)*); //here (constructor Texture(int) cannot be defined)
mSphere = new Sphere(1, 24, 24);
mSphere.setMaterial(material);
mSphere.*addLight(mLight)*; //and here (The method addLight(DirectionalLight) is undefined for the type Sphere)
addChild(mSphere);
} catch (TextureException e) {
e.printStackTrace();
}
getCurrentCamera().setZ(4.2f);
}
@Override
public void onDrawFrame(GL10 glUnused) {
super.onDrawFrame(glUnused);
mSphere.setRotY(mSphere.getRotY() + 1);
}
}
如果我可以提供帮助,我真的不想成为勺子饲料代码,但似乎错误出现在'DiffuseMaterial'中。除了使用min3D或Rajawali之外,为什么还有更好的方法来操作3D对象?
答案 0 :(得分:7)
我也一直在尝试使用下一个代码来运行这个rajawali教程。
Class RajawaliTutorialActivity
package rajawali.tutorials;
import rajawali.RajawaliActivity;
import android.os.Bundle;
public class RajawaliTutorialActivity extends RajawaliActivity {
public RajawaliTutorialRenderer mRenderer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRenderer = new RajawaliTutorialRenderer(this);
mRenderer.setSurfaceView(mSurfaceView);
super.setRenderer(mRenderer);
}
}
Class RajawaliTutorialRenderer
package rajawali.tutorials;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import rajawali.Camera;
import rajawali.Object3D;
import rajawali.lights.DirectionalLight;
import rajawali.materials.Material;
import rajawali.materials.textures.ATexture.TextureException;
import rajawali.materials.textures.Texture;
import rajawali.primitives.Sphere;
import rajawali.renderer.RajawaliRenderer;
public class RajawaliTutorialRenderer extends RajawaliRenderer {
public DirectionalLight light;
public Object3D sphere;
public Context context;
public Camera camera;
public RajawaliTutorialRenderer(Context context) {
super(context);
this.context = context;
setFrameRate(60);
}
public void initScene() {
light = new DirectionalLight(1f, 0.2f, -1.0f); // set the direction
light.setColor(1.0f, 1.0f, 1.0f);
light.setPower(2);
try{
Material material = new Material();
material.addTexture(new Texture("earthColors", R.drawable.earthtruecolor_nasa_big));
material.setColorInfluence(0);
sphere = new Sphere(1, 24, 24);
sphere.setMaterial(material);
getCurrentScene().addLight(light);
super.addChild(sphere);
} catch (TextureException e){
e.printStackTrace();
}
getCurrentCamera().setZ(4.2f);
}
@Override
public void onDrawFrame(GL10 glUnused) {
super.onDrawFrame(glUnused);
sphere.setRotY(sphere.getRotY() + 1);
}
}
看到更改是:
sphere
对象声明为Object3D
,而不是Sphere
。DiffuseMaterial
更改Material
以进行材料声明。Texture
。第一个参数是自定义标识符,第二个参数是资源ID。material.setColorInfluence(0);
,如果未添加此行,则“heart”变为红色(我不知道为什么)。sphere
对象(使用getCurrentScene
方法访问)以调用addLight
方法。material.addTexture()
添加try / catch,因为此方法现在抛出一个TextureException getCurrentCamera().setZ(4.2f);
添加到initScene 答案 1 :(得分:2)
看起来这与Rajawali
的版本有关。
在this page上,它表示不使用master
分支:
无论您选择克隆还是下载,您可能都希望使用其中一个版本标记。库和示例的主分支用于开发,对于生产代码应该被认为是不稳定的。当我们发布稳定版本时,它将被标记。如果您正在克隆,可以直接签出标签。
如果您使用Rajawali
克隆git
,则需要从代码中签出。列出标签:
$ git tag
v0.9
在撰写本文时,v0.9
是您唯一的选择。
$ git checkout v0.9
现在你可以DiffuseMaterial
了。但是,其他一些课程仍然缺失。
编辑:
看起来本教程既不适用于v0.9
也不适用于最新的主分支。我制作了教程1的工作版本,you can find linked here。
答案 2 :(得分:1)
您还可以使用我编写的RajawaliExamples应用程序,该应用程序由提供的示例组成,作为使用主分支的演示。
https://github.com/MasDennis/RajawaliExamples
此外,为了澄清Deans的引用,该声明表明,当API在其下方发生变化时,人们不会惊慌失措,这在jwoolston进行大规模更改以支持场景图时最为相关。大部分工作已完成,如果完成,api可能会从当前状态发生重大变化,因为其他主要项目已经完成。这些项目就像动画,更多解析选项,灵活渲染等等。