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

Math 如何将世界坐标转换为相机坐标?,math,opengl,3d,Math,Opengl,3d,我有一个输入3D矢量,以及相机的俯仰和偏航。有人能描述或提供一个资源链接,帮助我理解和实现所需的转换和矩阵映射吗?世界到摄影机转换矩阵是摄影机到世界矩阵的逆矩阵。“摄影机到世界”矩阵是对摄影机位置的平移和对摄影机方向的旋转的组合。因此,如果M是与相机方向相对应的3x3旋转矩阵,t是相机位置,则4x4相机到世界矩阵为: M00 M01 M02 tx M10 M11 M12 ty M20 M21 M22 tz 0 0 0 1 M00 M01 M02 tx M10 M11 M12 ty M2

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

世界到摄影机转换矩阵是摄影机到世界矩阵的逆矩阵。“摄影机到世界”矩阵是对摄影机位置的平移和对摄影机方向的旋转的组合。因此,如果M是与相机方向相对应的3x3旋转矩阵,t是相机位置,则4x4相机到世界矩阵为:

M00 M01 M02 tx M10 M11 M12 ty M20 M21 M22 tz 0 0 0 1 M00 M01 M02 tx M10 M11 M12 ty M20 M21 M22 tz 0 0 0 1 注意,我假设向量是列向量,在右边相乘以执行变换。如果使用相反的约定,请确保转置矩阵

要找到M,可以使用上列出的公式之一,具体取决于横摇、俯仰和偏航的特定约定。请记住,这些公式使用的惯例是向量是在左侧相乘的行向量


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

您所描述的被称为“透视投影”,网络上有大量的资源解释矩阵数学,并给出执行此操作所需的代码。如果我们有这样的结构来描述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];
    };
};
类矩阵x4x4
{
公众:
联盟
{
结构
{
Xx型、Xy型、Xz型、Xw型;
Yx、Yy、Yz、Yw型;
Zx、Zy、Zz、Zw型;
类型Wx、Wy、Wz、Ww;
};
结构
{
向量3右;
XW型;
矢量3向上;
YW型;
矢量3外观;
ZW型;
向量3位;
WW型;
};
输入asDoubleArray[4][4];
asArray型[16];
};
};
如果您只有Euler角度,即表示偏航、俯仰和横摇的角度,以及该位置在三维空间中的一个点,则可以计算向右、向上和环视向量。请注意,Right、Up和Look只是X、Y、Z向量,但由于这是一个相机,我发现这样命名比较容易。将旋转应用于摄影机矩阵的最简单方法是构建一系列旋转矩阵,并将摄影机矩阵乘以每个旋转矩阵

这里有一个很好的参考:

应用所有需要的旋转后,可以将矢量位置设置为摄影机在世界空间中的位置

最后,在应用摄影机的变换之前,需要获取摄影机矩阵的逆。这就是在开始绘制多边形之前要将modelview矩阵乘以的值。对于上述矩阵类,逆矩阵的计算如下:

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);
模板
Matrix4x4 Matrix4x4::正交正态逆(空)
{
Matrix4x4-OrthInv;
OrthInv=转置();
正弦波Xw=0;
OrthInv.Yw=0;
正弦波Zw=0;
正弦波Wx=-(右*位);
正弦波Wy=-(上行*位);
OrthInv.Wz=-(外观*位置);
返回OrthInv;
}
最后,当我们所有的矩阵构造都被排除在外时,你会做这样的事情:

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);
Matrix4x4摄像机矩阵、滚动旋转、俯仰旋转、偏航旋转;
矢量4摄像机定位;
cameraMatrix=cameraMatrix*滚动旋转*俯仰旋转*偏航旋转;
Matrix4x4 invCameraMat;
invCameraMat=cameraMatrix.OrthoNormalInverse();
glMultMatrixf(invCameraMat.asArray);

希望这能有所帮助。

摄像机到世界矩阵和反之亦然意味着什么?此外,左侧或右侧的乘法不清楚是Mv还是vM。