Визуализация базовой модели на 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, как вы можете видеть в этой записи в блоге я сделал.
Надеюсь это поможет!