繁体   English   中英

以3D旋转针孔相机

[英]Rotating a pinhole camera in 3D

我正在尝试在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向量。

进行此操作的更正确方法是将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 现在有两个正确的向量(一个下降上升相反),因此最后一个应该是正向向量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM