我正在使用Android版ARToolKit来构建AR应用程序。我可以毫无问题地在OpenGL中应用Projection Matrix和Marker Transformation Matrix,如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引擎?
最佳答案
查看我的代码,似乎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,我认为这就是您看到它们反转的原因。
最后,为了优化,您应该在执行之间重用矩阵,而不是每帧都创建一个新对象。
关于android - 在Android中集成jPCT-AE和ARToolKit,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32661506/