Визуализация базовой модели на JPCT-AE с помощью ARToolkit в Android

Я хочу визуализировать модель через 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*4 на Матрицу перевода и Матрицу вращения и установил в модель следующим образом:

model.translate(transformM .getTranslation());
model.setRotationMatrix(transformM ); 

Но до сих пор нет работы.

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

Я настоятельно рекомендую взглянуть на этот урок о матрицах и OpenGL, он не о JPCT, но все концепции могут быть применимы и к нему, и это то, что я использовал для правильного размещения моделей в маркерах на примере ARSimple, как вы можете видеть в этой записи в блоге я сделал.

Надеюсь это поможет!

Другие вопросы по тегам