Rajawali 教程04优化

通过优化,可以加载大型OBJ模型;通过序列化可避免每次都去加载一个.obj文件;它主要写所有相关的数据(顶点、指数正常,纹理坐标和颜色)二进制文件在磁盘上。

因此.obj文件必须在开发过程中只加载一次。一旦文件加载您可以将其保存到sdcard。为了做到这一点,首先需要在Androidmanifest.xml 配置写入权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果你支持Android 4.2.2还需要:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
加载并序列化一个文件:

MeshExporter exporter = new MeshExporter(myBaseObject3D);
exporter.export("myBaseObject3Dname", ExportType.SERIALIZED);
当这段代码完成. obj文件可以被丢弃,序列化文件写入到sd卡,被复制到资源文件夹(res/raw)

序列化模型现在已经准备好被加载到您的应用程序:

try {
	ObjectInputStream ois;
	ois = new ObjectInputStream(mContext.getResources().openRawResource(R.raw.my_serialized_model));
	mMyModel = new BaseObject3D((SerializedObject3D)ois.readObject());
	addChild(mMyModel);
	ois.close();
} catch (Exception e) {
	e.printStackTrace();
}
OK 搞定 进入下一个环节。

批处理几何图形

有时你可以将很多的相同类型的对象共享相同的材料。例如:球体的颜色材料

Appolonian sphere packing example - many identical objects

或多个数据集共享相同的结构:

Lots of cubes sharing a texture

而不是创建一个着色器,上传纹理,顶点缓冲区,等等对于相同的可以使用相同的,这样会使CPU和GPU之间的调用的数量急剧下降。

怎么做?

// -- First create the main object with a material and a texture.
//     The child objects will be cloned from this object.
Cube rootCube = new Cube(1.5f);
rootCube.setMaterial(new DiffuseMaterial());
rootCube.addLight(mLight);
rootCube.addTexture(mTextureManager.addTexture(b));
// -- This line indicates that all children will use the same material,
//     texture, vertices, indices, etc. The children can have their
//     own transformation and color.
rootCube.setRenderChildrenAsBatch(true);
addChild(rootCube);	

for(int i=0; i<500; i++) {
	// -- Clone from the main object and then set a position and rotation.
	BaseObject3D c = rootCube.clone();
	c.setPosition(-25f + (float)(Math.random() * 50f), -25f + (float)(Math.random() * 50f), -25f + (float)(Math.random() * 50f));
	c.setRotation((float)Math.random() * 360, (float)Math.random() * 360, (float)Math.random() * 360);
	rootCube.addChild(c);
}
正如你所看到的每一个对象都可以有它自己的旋转、位置和规模。 如果你不使用纹理也可以改变单个对象的颜色。 请注意,后者将创建一个新的缓冲可能降低性能(但不明显)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个使用Rajawali库在Android中展示3D模型的完整代码。其中包括使用的依赖和自定义的类。 1. build.gradle文件 ``` dependencies { implementation 'org.rajawali3d:rajawali:1.1.775@aar' implementation 'org.rajawali3d:rajawali-vuforia:1.1.775@aar' implementation 'org.rajawali3d:rajawali-jsonio:1.1.775@aar' implementation 'org.rajawali3d:rajawali-assimp:1.1.775@aar' } ``` 2. MainActivity.java文件 ``` import android.app.Activity; import android.os.Bundle; import org.rajawali3d.view.SurfaceView; import org.rajawali3d.renderer.Renderer; public class MainActivity extends Activity { private SurfaceView mSurfaceView; private Renderer mRenderer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取SurfaceView,并设置Renderer mSurfaceView = (SurfaceView) findViewById(R.id.surface_view); mRenderer = new MyRenderer(this); mSurfaceView.setSurfaceRenderer(mRenderer); } } ``` 3. MyRenderer.java文件 ``` import android.content.Context; import org.rajawali3d.renderer.Renderer; import org.rajawali3d.loader.LoaderOBJ; import org.rajawali3d.materials.Material; import org.rajawali3d.materials.textures.Texture; import org.rajawali3d.materials.textures.TextureManager; import org.rajawali3d.math.vector.Vector3; public class MyRenderer extends Renderer { private Context mContext; private Object3D mObject; public MyRenderer(Context context) { super(context); mContext = context; } @Override protected void initScene() { // 加载3D模型文件 LoaderOBJ objParser = new LoaderOBJ(mContext.getResources(), mTextureManager, R.raw.my_model_obj); try { objParser.parse(); mObject = objParser.getParsedObject(); mObject.setScale(0.5f); mObject.setPosition(Vector3.ZERO); mObject.setRotY(180); getCurrentScene().addChild(mObject); } catch (Exception e) { e.printStackTrace(); } // 创建材质并设置纹理 Material material = new Material(); Texture texture = new Texture("my_texture", R.drawable.my_texture); try { TextureManager.getInstance().addTexture(texture); material.addTexture(texture); } catch (TextureException e) { e.printStackTrace(); } // 应用材质到3D模型 mObject.setMaterial(material); } } ``` 4. activity_main.xml文件 ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <org.rajawali3d.view.SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> ``` 在这个示例代码中,我们使用了Rajawali库来加载3D模型,并使用Texture和Material来设置纹理和材质。在initScene()方法中,我们加载3D模型文件,并将其添加到场景中。然后,我们创建材质并将其应用到3D模型上。最后,我们将SurfaceView设置为渲染器,并将渲染器设置为MyRenderer类的实例。 需要注意的是,这只是一个简单的示例代码,实际上展示3D模型可能需要更多的代码和调整。但是,这个示例代码可以帮助您了解如何在Android中展示3D模型,并使用Rajawali库来实现这个功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值