Я хочу получить эффект мышиного взгляда.
Отказ от получения координат мыши и других вещей, суть проблемы в том, что:
используя фиксированную функцию opengl, это можно сделать, выполнив
glRotate(angley,0,1,0);
glRotate(anglex,1,0,0);
используя мой матричный класс, результат не такой, как указано выше:
mat4 cammtx;
cammtx.rotate(angley,0,1,0);
cammtx.rotate(anglex,1,0,0);
потому что камера по-прежнему не держит ось Y, то есть ось Z, кажется, вращается …
Как я могу добиться того же поведения glRotate с моей реализацией matrix :: rotate?
struct mat4
{
float m[16];
mat4(){identity();}
.
.
void rotate(float angle,float x,float y,float z){float res[16];matrix::rotate(res,m,a,x,y,z);memcpy(m,res,sizeof(float)*16);}
};
вот моя функция поворота (входной вектор не нормализован, я знаю, но я передаю только единичные векторы)
void rotate(float* mr,float* m,float angle,float x,float y,float z)
{
float a=angle*PI_OVER_180;
float m2[16] = {0};
float c=cos(a);
float s=sin(a);
float xx=x*x,
yy=y*y,
zz=z*z;m2[0] = xx+(1.0f-xx)*c;
m2[4] = (1.0f-c)*x*y-s*z;
m2[8] = (1.0f-c)*x*z+s*y;
m2[3] = 0.0f;
m2[1] = (1.0f-c)*y*x+s*z;
m2[5] = yy+(1.0f-yy)*c;
m2[9] = (1.0f-c)*y*z-s*x;
m2[7] = 0.0f;
m2[2] = (1.0f-c)*z*x-s*y;
m2[6] = (1.0f-c)*z*y+s*x;
m2[10] = zz+(1.0f-zz)*c;
m2[11] = 0.0f;
m2[12] = 0;
m2[13] = 0;
m2[14] = 0;
m2[15] = 1.0f;
multiply(mr,m2,m);
}
И это функция умножения
float* multiply(float* c,float* aa,float* bb)
{
for(int i = 0; i < 4; i++)
{
c[i*4] = bb[i*4] * aa[0] + bb[i*4+1] * aa[4] + bb[i*4+2] * aa[8] + bb[i*4+3] * aa[12];
c[i*4+1] = bb[i*4] * aa[1] + bb[i*4+1] * aa[5] + bb[i*4+2] * aa[9] + bb[i*4+3] * aa[13];
c[i*4+2] = bb[i*4] * aa[2] + bb[i*4+1] * aa[6] + bb[i*4+2] * aa[10] + bb[i*4+3] * aa[14];
c[i*4+3] = bb[i*4] * aa[3] + bb[i*4+1] * aa[7] + bb[i*4+2] * aa[11] + bb[i*4+3] * aa[15];
}
return c;
}
С помощью multiply (...)
как это написано, вы в настоящее время предварительно умножаете m2
а также m
, Потому что OpenGL использует (что более важно, потому что ваш код вращения производит матрицы столбцов-мажоров, чтобы выполнить последовательность умножений матриц в правильном порядке, вам нужно постмножить операнды.
Это можно сделать, просто изменив конец вашего rotate (...)
функция для чтения:
multiply(mr,m,m2); // Result = Matrix * Rot
Имейте в виду, что вам нужно делать это для всех операций с матрицами, которые вы решите реализовать самостоятельно. Перевод, масштабирование и т. Д. Предполагая, что вы придерживаетесь обозначений основных столбцов, вы должны постмножить.
Других решений пока нет …