В моем визуализаторе, у меня есть: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 градусов.
Кто-нибудь знает, что может вызвать это?
Я не могу решить, если это сделано неправильным умножением матрицы или неправильной настройкой матрицы вращения.
Это лучше использовать кватернионов при рассмотрении поворотов с участием нескольких осей. Также предотвращает блокировку карданных подвесок. – kineticfocus
Можете ли вы уточнить, я сейчас ничего не знаю об этом методе. – user1993006
Ive пробовал кватернионы. Вращение вокруг оси x и y отлично работает, а деформации оси ab z остаются. – user1993006