如何使用适用于 Android Studio 的 Cardboard SDK 和 RajawaliVR 3D 渲染器创建标线?
我搜索了许多网站和 github 上的 Rajawali wiki,试图找到一个解决方案,将 3D 对象以完美的方向保持在用户视图的中心。我确实偶然发现了 WIKI 上的链接,但它没有提供与 RajawaliVR 一起使用的解决方案。
经过反复试验,我想出了这个解决方案
首先在渲染器中创建一个 3D 对象
Sphere RETICLE = new Sphere(1, 50, 32);
Material sphereMaterial = new Material();
sphereMaterial.enableLighting(true);
sphereMaterial.setDiffuseMethod(new DiffuseMethod.Lambert());
RETICLE.setMaterial(sphereMaterial);
try{
sphereMaterial.addTexture(tExture);
} catch (ATexture.TextureException error){
Log.d("DEBUG", "TEXTURE ERROR");
}
接下来,您需要将以下代码放置在您的渲染器类中
public void centerObject(Object3D obj){
float[] newPosition4 = new float[4];
float[] posVec4 = {0, 0, -3, 1.0f};
float[] HeadViewMatrix_inv = new float[16];
Matrix4 HeadViewMatrix4 = new Matrix4();
HeadViewMatrix4.setAll(mHeadViewMatrix);
HeadViewMatrix4 = HeadViewMatrix4.inverse();
HeadViewMatrix4.toFloatArray(HeadViewMatrix_inv);
Matrix.multiplyMV(newPosition4, 0, HeadViewMatrix_inv, 0, posVec4, 0);
obj.setPosition(newPosition4[0], newPosition4[1], newPosition4[2]);
obj.setLookAt(getCurrentCamera().getPosition());
}
然后,您可以从 onRender 方法调用 centerObject 方法或构建一个处理程序。(每次绘制新帧时都会调用 on render 方法。)
@Override
public void onRender(long elapsedTime, double deltaTime) {
super.onRender(elapsedTime, deltaTime);
if(RETICLE != null)centerObject(RETICLE);
}
在调用 centerObject() 之前进行空检查很重要,因为场景可能会在对象创建之前渲染。
上面的 Rajawali WIKI 链接提供了一些很好的线索,但该问题已关闭。我确实在那里评论了我的解决方案,以帮助为面临同样问题的下一个人提供交钥匙解决方案。
我希望对某些人有所帮助。请发布更好、改进或其他解决方案,以便其他人受益。