Вращение камеры-обскуры в 3D

Я пытаюсь повернуть камеру-обскуру в трехмерном пространстве. Я ранее проследил комнату. Как хорошая практика, я сначала сделал математику и попытался программировать математику на c ++.

// 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]);

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

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

Любая помощь или ссылки приветствуются.

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;

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]