Я пытаюсь повернуть камеру-обскуру в трехмерном пространстве. Ранее я провел трассировку комнаты. В качестве хорошей практики я сначала сделал математику и попытался запрограммировать математику на С++.
// 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, то векторы, представляющие направления вправо (ось x), вниз (ось y) и вперед (ось 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]);
Чтобы смоделировать вращающуюся камеру, вам нужно использовать эти направления как при перемещении камеры, так и при отбрасывании лучей.
Я не понимаю, как я должен использовать приведенную выше информацию.
Любая помощь или ссылки приветствуются.