1

我想通过 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 ); 

但仍然没有工作。

4

1 回答 1

1

我建议更好地组织您的代码,并使用矩阵来分离对模型进行的转换和将模型放置在标记中的转换。

我的建议是:

首先,使用附加矩阵。它可能被称为模型矩阵,因为它将存储对模型所做的转换(缩放、旋转和平移)。

然后,在此方法之外声明所有矩阵(仅出于性能原因,但建议使用),并在每一帧上简单地为它们设置标识:

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);

我强烈建议查看有关矩阵和 OpenGL 的本教程,它与 JPCT 无关,但所有概念也可能适用于那里,这是我使用 ARSimple 示例将模型正确放置在标记中的方法,如您所见在我制作的这篇博文中

希望这可以帮助!

于 2015-12-28T07:02:50.087 回答