Представление камеры с помощью векторов:
Матрица вращения вокруг единичного вектора v на угол омега:
Вычисление матрицы камеры:
// вектор бинормали
Vector sideVec(viewMat.p[0], viewMat.p[1], viewMat.p[2]);
//вектор нормали (указывает "верх" камеры)
Vector upVec(viewMat.p[3], viewMat.p[4], viewMat.p[5]);
// вектор направления
Vector dirVec(viewMat.p[6], viewMat.p[7], viewMat.p[8]);
// построение матрицы поворота (по формуле выше на рисунке)
Matrix Rot(camAng.y, (dirVec ^ upVec).Normalize());
// добавление вращения по оси Y (он указывает верх камеры), которое зависит от смещение мыши по х
Rot.AddRotationY(-camAng.x);
// обновление векторов камеры (домножение на матрицу поворота)
upVec = Rot * upVec;
dirVec = Rot * dirVec;
sideVec = Rot * sideVec;
// обновление матрицы камеры
viewMat.p[0] = sideVec.x; viewMat.p[1] = sideVec.y; viewMat.p[2] = sideVec.z;
viewMat.p[3] = upVec.x; viewMat.p[4] = upVec.y; viewMat.p[5] = upVec.z;
viewMat.p[6] = dirVec.x; viewMat.p[7] = dirVec.y; viewMat.p[8] = dirVec.z;
// обновление матрицы камеры с учетом ее позиции
float m[16] = {
viewMat.p[0], viewMat.p[3], -viewMat.p[6], 0,
viewMat.p[1], viewMat.p[4], -viewMat.p[7], 0,
viewMat.p[2], viewMat.p[5], -viewMat.p[8], 0,
-(viewMat.p[0]*camSrc.x + viewMat.p[1]*camSrc.y + viewMat.p[2]*camSrc.z),
-(viewMat.p[3]*camSrc.x + viewMat.p[4]*camSrc.y + viewMat.p[5]*camSrc.z),
(viewMat.p[6]*camSrc.x + viewMat.p[7]*camSrc.y + viewMat.p[8]*camSrc.z),
1
};
Технологический раздел