2015-11-04 6 views
1

Я хочу рендерить модель через JPCT-AE и использовать ARToolkit для реализации приложения AR.Оказание базовой модели на JPCT-AE с помощью ARToolkit в Android

так, я впрыснуть код, как показано ниже в проект 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); 

И потом, эта модель может быть визуализации на экране, но всегда лежат на отметке в экране, когда я с помощью модели. rotateX/Y/Z ((float) Math.PI/2);

На самом деле, выход матрицы из ARToolkit :: ARNativeActivity.getTransformationMatrix() является правильным, а затем я разделить это 4 * 4Matrix в переводе матрицы и матрицы поворота и установить в модель, как это:

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

Но все еще нет работы.

ответ

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.

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