【问题标题】:Rendering a model basic on JPCT-AE with ARToolkit in Android在 Android 中使用 ARToolkit 渲染基于 JPCT-AE 的模型
【发布时间】:2016-02-04 10:13:45
【问题描述】:

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

但仍然没有工作。

【问题讨论】:

    标签: java android artoolkit jpct


    【解决方案1】:

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

    我的建议是:

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

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

    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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多