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