Приветствую всех! Такая проблема. Есть класс камеры на кватернионах. Вроде всё правильно работает, кроме одной штуки – координата z с обратным знаком. Т. е., например, камера находиться в первом октанте декартовой системы координат, координата x и y отрицательны, а вот координата z с положительным знаком. Достало уже, не знаю, как с этим справиться. API - OpenGL с вытекающими отсюда последствиями. Система координат правосторонняя – синяя линия ось z, зелёная – ось y, красная – ось x.
Функция, обновляющая видовую матрицу:
inline GLvoid Cam::SetPrespective()
{
static GLfloat qx2, qy2, qz2, qxx, qyy, qzz, qxy, qyz, qxz, qwy, qwx, qwz;
qSide.CreateFromAxisAngle(ecVector3f(1.0f, 0.0f, 0.0f), CamPitchDegs);
qHead.CreateFromAxisAngle(ecVector3f(0.0f, 1.0f, 0.0f), CamHeadingDegs);
Q = qHead * qSide;
Q.CreateMatrix(m);
Q = qSide * qHead;
qx2 = Q.q[1] + Q.q[1];
qy2 = Q.q[2] + Q.q[2];
qz2 = Q.q[3] + Q.q[3];
qxx = Q.q[1] * qx2; qxy = Q.q[1] * qy2; qxz = Q.q[1] * qz2;
qyy = Q.q[2] * qy2; qyz = Q.q[2] * qz2; qzz = Q.q[3] * qz2;
qwx = Q.q[0] * qx2; qwy = Q.q[0] * qy2; qwz = Q.q[0] * qz2;
vSide.v[0] = 1.0f - qyy - qzz;
vSide.v[1] = qxy - qwz;
vSide.v[2] = qxz + qwy;
vHead.v[0] = qxy + qwz;
vHead.v[1] = 1.0f - qxx - qzz;
vHead.v[2] = qyz - qwx;
vView.v[0] = qxz - qwy;
vView.v[1] = qyz + qwx;
vView.v[2] = 1.0f - qxx - qyy;
m[12] = vSide.GetInner(vLoc);
m[13] = vHead.GetInner(vLoc);
m[14] = -vView.GetInner(vLoc);
glMultMatrixf(m);
}
Само приложение:
http://islandengine.ucoz.ru/Camera.rar.