【问题标题】:Rotating a pinhole camera in 3D在 3D 中旋转针孔相机
【发布时间】:2016-04-13 16:45:27
【问题描述】:

我正在尝试在 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 轴)方向 van be 检索为:

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

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

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

任何帮助或参考表示赞赏。

【问题讨论】:

    标签: c++ raytracing rotational-matrices


    【解决方案1】:

    在更改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;
    

    至于相机定义,相机需要三个向量来定义它的方向。如果您旋转相机,则方向也会旋转,否则您只需移动相机,它就会始终朝一个方向看。

    黄色的定义是不正确的,因为应该有三个垂直向量,通常是uprightforward。现在有两个右向量(一个是 downup 正好相反),所以最后一个应该是 forward 向量。

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

    【讨论】:

    • 感谢您的回答。关于黄色突出显示的部分,您了解它的含义吗?
    • 意思是旋转矩阵的每一行对应一个方向向量(相对于基本框架所代表的)。所以R 的第 1 行是“右”方向向量等。与一般物理上下文中的 x-hat、y-hat 和 z-hat 进行比较。我认为第二个“正确”是一个错字,应该说“前进”。
    • 是的,我也相信。谢谢:)
    • @Lebowski 也添加了关于这些的信息,user2475059 关于第二个 rightforward 是正确的。
    • @SamiKuhmonen 我没有在我的代码中的任何地方实现“右”、“下”、“前”。你所做的修改工作,我有一个轮换。我只是不确定它是旋转还是平移,因为我担心必须使用“右”、“下”、“前”才能获得正确的视角。我有点困惑。
    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多