Перемещение и вращение камеры

 

Представление камеры с помощью векторов:

 

 

 

Матрица вращения вокруг единичного вектора 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

};

 

 

 

 

Технологический раздел


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: