在3D中旋转针孔相机

Rotating a pinhole camera in 3D

本文关键字:相机 孔相机 3D 旋转      更新时间:2023-10-16

我正在尝试在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]);

若要为旋转相机建模,您需要在以下两种情况下都使用这些方向移动摄影机和投射光线时。

我不明白我应该如何使用上述信息。

感谢任何帮助或推荐。

在更改yaw之后,您似乎没有更新R矩阵。这意味着每次执行camerapos = R * camerapos时,都会在一个方向上旋转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,与up正好相反),所以最后一个应该是forward向量。

这些矢量定义光线跟踪器中使用的方向。"向前"是光线追踪到的位置,向上和向右定义每个图像像素在图像平面中的位移方向。您很可能已经在跟踪代码中使用了这些。