如何将世界坐标转换为相机坐标?

时间:2009-03-29 17:55:55

标签: math opengl 3d

我有一个输入3D矢量,以及相机的俯仰和偏航。任何人都可以描述或提供资源链接,以帮助我理解和实现所需的转换和矩阵映射吗?

3 个答案:

答案 0 :(得分:15)

世界到相机变换矩阵是相机到世界矩阵的逆矩阵。摄像机到世界的矩阵是摄像机位置的平移和摄像机方向的旋转的组合。因此,如果 M 是对应于相机方向的3x3旋转矩阵,而 t 是相机的位置,那么4x4相机到世界矩阵是:

M00 M01 M02 tx
M10 M11 M12 ty
M20 M21 M22 tz
0   0  0   1

请注意,我假设向量是在右侧相乘的列向量,以执行转换。如果使用相反的约定,请确保转置矩阵。

要查找 M ,您可以使用Wikipedia上列出的公式之一,具体取决于您对滚动,俯仰和偏航的特定约定。请记住,这些公式使用的向量是向量是在左侧乘以的行向量。

不是计算相机到世界的矩阵并反转它,更有效(和数值稳定)的替代方案是直接计算世界到相机矩阵。为此,只需反转相机的位置(通过否定所有3个坐标)及其方向(通过否定滚动,俯仰和偏转角度,并将它们调整到适当的范围),然后使用相同的方法计算矩阵算法

答案 1 :(得分:7)

如果我们有这样的结构来描述4x4矩阵:

class Matrix4x4
{
public:
    union
    {
        struct
        {
            Type Xx, Xy, Xz, Xw;
            Type Yx, Yy, Yz, Yw;
            Type Zx, Zy, Zz, Zw;
            Type Wx, Wy, Wz, Ww;
        };

        struct
        {
            Vector3<Type> Right;
            Type XW;
            Vector3<Type> Up;
            Type YW;
            Vector3<Type> Look;
            Type ZW;
            Vector3<Type> Pos;
            Type WW;
        };

        Type asDoubleArray[4][4];
        Type asArray[16];
    };
};

如果只有欧拉角,即表示偏航,俯仰和滚动的角度以及位置的3d空间中的点,则可以计算右,向上和向量矢量。请注意,Right,Up和Look只是X,Y,Z向量,但由于这是一个摄像头,我发现它更容易命名。将相机应用到相机矩阵的最简单方法是构建一系列旋转矩阵,并将每个旋转矩阵乘以相机矩阵。

这方面的一个很好的参考是:http://www.euclideanspace.com

一旦应用了所有需要的旋转,就可以将矢量Pos设置为相机在世界空间中的位置。

最后,在应用相机的变换之前,您需要将相机的矩阵反转。这是您在开始绘制多边形之前将模型视图矩阵乘以的原因。对于上面的矩阵类,逆算计算如下:

template <typename Type>
Matrix4x4<Type> Matrix4x4<Type>::OrthoNormalInverse(void)
{
    Matrix4x4<Type> OrthInv;
    OrthInv = Transpose();
    OrthInv.Xw = 0;
    OrthInv.Yw = 0;
    OrthInv.Zw = 0;
    OrthInv.Wx = -(Right*Pos);
    OrthInv.Wy = -(Up*Pos);
    OrthInv.Wz = -(Look*Pos);
    return OrthInv;
}

最后,在我们所有的矩阵构造完成之后,你会做这样的事情:

Matrix4x4<float> cameraMatrix, rollRotation, pitchRotation, yawRotation;
Vector4<float> cameraPosition;

cameraMatrix = cameraMatrix * rollRotation * pitchRotation * yawRotation;

Matrix4x4<float> invCameraMat;

invCameraMat = cameraMatrix.OrthoNormalInverse();

glMultMatrixf(invCameraMat.asArray);

希望这有帮助。

答案 2 :(得分:-10)

您所描述的内容称为“透视投影”,网络上有大量资源可用于解释矩阵数学并提供执行此操作所需的代码。您可以从wikipedia page

开始