使用Android中的ARToolkit在JPCT-AE上渲染基本模型

时间:2015-11-04 03:07:10

标签: java android artoolkit jpct

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

但仍然没有工作。

1 个答案:

答案 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看到。

希望这有帮助!