2

我正在使用适用于 Android 的 ARToolKit 来构建 AR 应用程序。我可以毫无问题地在 OpenGL 中应用投影矩阵和标记变换矩阵,如 ARSimple 示例中所述。但是,我没有找到将这些正确应用到 jPCT-AE 相机的方法。这是我为相机所做的:

Camera cam = world.getCamera();
Matrix projMatrix = new Matrix();
projMatrix.transformToGL();
projMatrix.setDump(ARToolKit.getInstance().getProjectionMatrix());

cam.setPosition(projMatrix.getTranslation());
cam.setBack(projMatrix);

对于对象:

Matrix objMat = new Matrix();
objMat.transformToGL();
objMat.setDump(ARToolKit.getInstance().queryMarkerTransformation(markerID));
cube.setTranslationMatrix(objMat);
cube.setRotationMatrix(objMat);

它几乎可以工作:如果将标记放在屏幕中央,我可以看到 3D 对象。但是,当我移动标记时,它会迅速从屏幕上消失。此外,立方体(以及我尝试加载的其他模型)似乎以某种“倒置”的方式呈现。对于我在网上阅读的内容,ARToolKit 矩阵是相对于 OpenGL 世界坐标的(而 jPCT-AE 有自己的坐标),并且 jPCT-AE 的投影矩阵是基于 fov、近处和远方裁剪平面在内部构建的,位置和旋转,然后我不能直接设置它。

如何将投影矩阵和标记矩阵转换为 jPCT-AE 引擎?

4

1 回答 1

2

查看我的代码,似乎 JPCT-AE 没有从矩阵中正确获取位置和返回向量(尽管我看不出它为什么不这样做的原因),但是当您将它们拆分为单独的向量时它会这样做。这只是我反复试验的结果。

这就是我为相机所做的,使用方向和向上向量。

float[] projection = ARToolKit.getInstance().getProjectionMatrix();
Matrix projMatrix = new Matrix();
projMatrix.setDump(projection);
projMatrix.transformToGL();
SimpleVector translation = projMatrix.getTranslation();
SimpleVector dir = projMatrix.getZAxis();
SimpleVector up = projMatrix.getYAxis();
mCamera.setPosition(translation);
mCamera.setOrientation(dir, up);

然后对于模型,我提取平移和旋转。清除翻译很重要,因为它不是绝对位置,而是对当前位置的修改。我认为这可能是对象移出屏幕的主要问题。

float[] transformation = ARToolKit.getInstance().queryMarkerTransformation(markerID);
Matrix dump = new Matrix();
dump.setDump(transformation);
dump.transformToGL();
mModel.clearTranslation();
mModel.translate(dump.getTranslation());
mModel.setRotationMatrix(dump);

另外,您应该在调用 setDump 后执行 transformToGl,我认为这就是您看到它们倒置的原因。

最后,您应该在执行之间重用矩阵,而不是每帧创建一个新对象,以进行优化。

于 2015-09-21T09:04:29.610 回答