2013-02-18 2 views
0

В моем визуализаторе, у меня есть:Android OpenGL матрица вращения деформация

private float[] MATRIX_VIEW = new float[16]; 
private float[] MATRIX_PROJECTION = new float[16]; 
private float[] MATRIX_VP = new float[16]; 

в "onSurfaceChanged":

... 
//Set projection 
Matrix.orthoM(
    MATRIX_PROJECTION,0, 
    -hDim,hDim, 
    -vDim,vDim, 
    1,100 
); 
//Set View 
Matrix.setLookAtM(
    MATRIX_VIEW,0, 
    cameraPosition[0], 
    cameraPosition[1], 
    cameraPosition[2], 
    cameraFacing[0], 
    cameraFacing[1], 
    cameraFacing[2], 
    cameraHook[0], 
    cameraHook[1], 
    cameraHOOK[2] 
); 
//SetView*Projection 
Matrix.multiplyMM(
    MATRIX_VP,0, 
    MATRIX_PROJECTION,0, 
    MATRIX_VIEW,0 
); 
... 

У меня есть много клонов одной формы, так я написал класс "ShapeSet_Set" с:

...  
private float[] MATRIX_ORIGIN = new float[16]; 
private float[] MATRIX_VPO = new float[16]; 

private float[] MATRIX_SCALE = new float[16]; 
... 

/* 
origin matrix is group of all shapes center position 
scale matrix represents zoom 
*/ 

и "ShapeSet_Element" с:

...  
private float[] MATRIX_POSITION = new float[16]; 
private float[] MATRIX_ROTATION = new float[16]; 

private float[] MATRIX_ALL = new float[16]; 
... 

/* 
position matrix is position of shape relative to origin position 
rotation matrix is shape rotation arond its center 
all matrix is matrix which will be passed to shader 
*/ 

В режиме рендеринга на «DrawFrame», ShapeSet_Set «onDrawFrame» настроен. Он рассчитывает вид * Проекция * Origin матрицы:

... 
Matrix.multiplyMM(
    MATRIX_VPO,0, 
    RENDERER.getVPMatrix(),0, 
    MATRIX_ORIGIN,0 
); 
... 

и называет каждый ShapeSet_Element в "onDrawFrame", который содержит:

... 
//Get View*Projection*Origin matrix 
System.arraycopy(
    SET.getVPOMatrix(),0, 
    MATRIX_ALL,0, 
    16 
); 
//Apply zoom 
Matrix.multiplyMM(
    MATRIX_ALL,0, 
    MATRIX_ALL,0, 
    SET.getScaleMatrix(),0 
); 
//Apply element's position 
Matrix.multiplyMM(
    MATRIX_ALL,0, 
    MATRIX_ALL,0, 
    MATRIX_POSITION,0 
); 
//Apply element's rotation 
Matrix.multiplyMM(
    MATRIX_ALL,0, 
    MATRIX_ALL,0, 
    MATRIX_ROTATION,0 
); 
... 

Все работает отлично, пока я не применять вращение. Этот метод используется, чтобы установить вращение элемента:

public void setRotation(float xDeg,float yDeg,float zDeg) 
{ 
    //Set new rotation values to open up actual values 
    rotation_X = xDeg; 
    rotation_Y = yDeg; 
    rotation_Z = zDeg; 
    //Set new rotation matrix 
    Matrix.setIdentityM(MATRIX_ROTATION,0); 
    //Rotate around x axis 
    Matrix.rotateM(
    MATRIX_ROTATION,0, 
    rotation_X,0, 
    1,0,0 
); 
    //Rotate around y axis 
    Matrix.rotateM(
    MATRIX_ROTATION,0, 
    -rotation_Y,0, 
    0,1,0 
); 
    //Rotate around z axis 
    Matrix.rotateM(
    MATRIX_ROTATION,0, 
    rotation_Z,0, 
    0,0,-1 
); 
} 

Когда элемент поворачивается вокруг х или оси у, она работает хорошо, но ... при повороте вокруг оси г, высота элемента (оригинал у размерности) является geometricaly уменьшен до 0, при повороте на 90 градусов и увеличен до исходного значения при повороте на 180 градусов.

Кто-нибудь знает, что может вызвать это?

Я не могу решить, если это сделано неправильным умножением матрицы или неправильной настройкой матрицы вращения.

+0

Это лучше использовать кватернионов при рассмотрении поворотов с участием нескольких осей. Также предотвращает блокировку карданных подвесок. – kineticfocus

+0

Можете ли вы уточнить, я сейчас ничего не знаю об этом методе. – user1993006

+0

Ive пробовал кватернионы. Вращение вокруг оси x и y отлично работает, а деформации оси ab z остаются. – user1993006

ответ

0

избежать шарнирного замка без кватернионов, как этот http://tutorialrandom.blogspot.com/2012/08/how-to-rotate-in-3d-using-opengl-proper.html

это звучит как что-то в вашей видовой матрице происходит не так, попробуйте сделать ротацию, как и в приведенной выше ссылке, и это может решить вашу проблему

Смежные вопросы