2016-04-13 5 views
0

Я пытаюсь повернуть камеру-обскуры в 3D-пространстве. Раньше я просматривал комнату. В качестве хорошей практики я сначала сделал математику и попытался запрограммировать математику в C++.Вращение камеры-обскуры в 3D

// Camera position 
vec3 cameraPos(0, 0, -19); 


// Rotate camera 
float& yaw; 
vec3 c1(cos(yaw), 0, sin(yaw)); 
vec3 c2(0, 1, 0); 
vec3 c3(-sin(yaw), 0, cos(yaw)); 
glm::mat3 R(c1, c2, c3); 

То, что я сделал, чтобы повернуть камеру так:

if (keystate[SDLK_LEFT]) 
{ 
    //cameraPos.x -= translation; 
    if (yaw > 0) 
    { 
     yaw = 0.01; 
    } 
    cout << yaw << endl; 
    cameraPos = R * cameraPos; 
    cout << "LEFT" << endl; 
} 
if (keystate[SDLK_RIGHT]) 
{ 
    //cameraPos.x += translation; 
    if (yaw > 0) 
    { 
     yaw = -0.01; 
    } 
    cout << yaw << endl; 
    cameraPos = R * cameraPos; 
    cout << "RIGHT" << endl; 
} 

умножал вращение матрицы R с вектором положения камеры. Теперь происходит то, что комната движется только налево, независимо от того, какую клавишу я нажимаю.

В учебнике я следую говорит:

Если камера вращается с помощью матрицы R, то векторы, представляющей правую (ось х), вниз (ось у) и вперед (Z-ось) направления ван быть извлекаться как:

vec3 right(R[0][0],R[0][1],R[0][2]); 
vec3 down(R[1][0],R[1][1],R[2][2]); 
vec3 right(R[2][0],R[2][1],R[2][2]); 

для модели вращающейся камеры вы должны использовать эти направления как при перемещения камеры и когда вы разыгрываете лучи.

Я не понимаю, как я должен использовать приведенную выше информацию.

Любая помощь или рекомендации оценены.

ответ

0

Возможно, вы не обновляете свою матрицу R после смены yaw. Это означает, что каждый раз, когда вы делаете camerapos = R * camerapos, вы вращаете вектор camerapos в одном направлении.

Более подходящий способ сделать это будет иметь отдельные камеры, каждый раз строить R и использовать другой вектор для результата положения камеры.

Что-то вроде этого:

// Camera position 
vec3 cameraPos(0, 0, -19); 
vec3 trueCameraPos; 
float yaw; 

if (keystate[SDLK_LEFT]) 
{ 
    //cameraPos.x -= translation; 
    if (yaw > 0) 
    { 
     yaw = 0.01; 
    } 
    cout << yaw << endl; 
    cout << "LEFT" << endl; 
} 
if (keystate[SDLK_RIGHT]) 
{ 
    //cameraPos.x += translation; 
    if (yaw > 0) 
    { 
     yaw = -0.01; 
    } 
    cout << yaw << endl; 
    cout << "RIGHT" << endl; 
} 

// Rotate camera 
vec3 c1(cos(yaw), 0, sin(yaw)); 
vec3 c2(0, 1, 0); 
vec3 c3(-sin(yaw), 0, cos(yaw)); 
glm::mat3 R(c1, c2, c3); 

trueCameraPos = R * cameraPos; 

Что касается определения камеры, камера нуждается в трех векторов, чтобы определить его ориентацию. Если вы поворачиваете камеру, ориентация также вращается, иначе вы просто переместите камеру, и она всегда будет смотреть в одном направлении.

определение желтым неверен, так как должно быть три перпендикулярные векторы, как правило, вверх, право и вперед. Теперь есть два правильных вектора (один из которых down - это просто противоположность до будет), поэтому последний должен быть вперед вектор.

Эти векторы определяют направления, используемые в raytracer. Вперед, где прослеживаются лучи, вверх и вправо определяют направления перемещения в плоскости изображения для каждого пикселя изображения. Скорее всего, вы используете их уже в своем коде отслеживания.

+0

Спасибо за ваш ответ. Что касается желтого выделенного раздела, вы понимаете, что это значит? – Lebowski

+1

Говорят, что каждая строка матрицы вращения соответствует вектору направления (относительно того, что представляет собой базовый кадр).Таким образом, строка 1 «R» является «правильным» вектором направления и т. Д. Сравните с x-hat, y-hat и z-hat в общих физических контекстах. Я считаю, что второе «право» - это опечатка и предназначалось для того, чтобы сказать «вперед». – user2475059

+0

Да, я тоже так считаю. Спасибо :) – Lebowski

Смежные вопросы