Math 如何将世界坐标转换为相机坐标?
我有一个输入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,可以使用上列出的公式之一,具体取决于横摇、俯仰和偏航的特定约定。请记住,这些公式使用的惯例是向量是在左侧相乘的行向量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
与计算摄影机到世界矩阵并将其反转不同,更有效(且数值稳定)的替代方法是直接计算世界到摄影机矩阵。为此,只需反转相机的位置(通过否定所有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。