我想通过JPCT-AE渲染模型并使用ARToolkit来实现AR应用程序。
所以,我将以下代码注入ARToolkit项目:
Matrix projMatrix = new Matrix();
projMatrix.setDump(ARNativeActivity.getProjectM());
projMatrix.transformToGL();
SimpleVector translation = projMatrix.getTranslation();
SimpleVector dir = projMatrix.getZAxis();
SimpleVector up = projMatrix.getYAxis();
cameraController.setPosition(translation);
cameraController.setOrientation(dir, up);
Matrix transformM = new Matrix();
transformM .setDump(ARNativeActivity.getTransformationM());
transformM .transformToGL();
model.clearTranslation();
model.translate(transformM .getTranslation());
dump.setRow(3,0.0f,0.0f,0.0f,1.0f);
model.clearRotation();
model.setRotationMatrix(transformM );
然后,模型可以在屏幕上呈现,但总是位于屏幕上的标记上,我使用的是model.rotateX / Y / Z((float)Math.PI / 2);
实际上,ARToolkit :: ARNativeActivity.getTransformationMatrix()的矩阵输出是正确的,然后我将这个4 * 4Matrix拆分为平移矩阵和旋转矩阵,并设置为如下模型:
model.translate(transformM .getTranslation());
model.setRotationMatrix(transformM );
但仍然没有工作。
答案 0 :(得分:1)
我建议组织更好的代码,并使用矩阵分离转换以使模型和转换将模型放置在标记中。
我的建议是:
首先,使用额外的矩阵。它可以被称为modelMatrix,因为它将存储对模型进行的转换(缩放,旋转和平移)。
然后,声明此方法之外的所有矩阵(仅出于性能原因,但建议使用),并且在每个帧上只需setIdentity:
projMatrix.setIdentity();
transformM.setIdentity();
modelM.setIdentity();
之后,在modelM矩阵上进行模型转换。放置在标记上后,此转换将应用于模型。
modelM.rotateZ((float) Math.toRadians(-angle+180));
modelM.translate(movementX, movementY, 0);
然后,将modelM矩阵乘以trasnformM(这意味着你完成了所有的变换,并按照transformM描述的那样移动和旋转它们,在我们的例子中,这意味着对模型进行的所有变换都在标记)。
//now multiply trasnformationMat * modelMat
modelM.matMul(trasnformM);
最后,将旋转和平移应用于模型:
model.setRotationMatrix(modelM);
model.setTranslationMatrix(modelM);
所以整个代码看起来像:
projMatrix.setIdentity();
projMatrix.setDump(ARNativeActivity.getProjectM());
projMatrix.transformToGL();
SimpleVector translation = projMatrix.getTranslation();
SimpleVector dir = projMatrix.getZAxis();
SimpleVector up = projMatrix.getYAxis();
cameraController.setPosition(translation);
cameraController.setOrientation(dir, up);
model.clearTranslation();
model.clearRotation();
transformM.setIdentity();
transformM .setDump(ARNativeActivity.getTransformationM());
transformM .transformToGL();
modelM.setIdentity()
//do whatever you want to your model
modelM.rotateZ((float)Math.toRadians(180));
modelM.matMul(transformM);
model.setRotationMatrix(modelM );
model.setTranslationMatrix(modelM);
我强烈建议你看看这个tutorial about matrices and OpenGL,它不是关于JPCT,但所有概念也可能适用于那里,而且我已经习惯将正确的模型放在标记中,并使用ARSimple示例作为你可以在this blog entry I made看到。
希望这有帮助!