我有一个输入3D矢量,以及相机的俯仰和偏航.任何人都可以描述或提供资源链接,以帮助我理解和实现所需的转换和矩阵映射吗?
Ada*_*eld 17
世界到相机的变换矩阵是相机到世界矩阵的逆.摄像机到世界的矩阵是摄像机位置的平移和摄像机方向的旋转的组合.因此,如果M是对应于摄像机方向的3x3旋转矩阵,而t是摄像机的位置,那么4x4摄像机到世界矩阵是:
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];
};
};
Run Code Online (Sandbox Code Playgroud)
如果您拥有的是欧拉角,即表示偏航,俯仰和滚动的角度以及位置的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;
}
Run Code Online (Sandbox Code Playgroud)
最后,在我们所有的矩阵构造完成之后,你会做这样的事情:
Matrix4x4<float> cameraMatrix, rollRotation, pitchRotation, yawRotation;
Vector4<float> cameraPosition;
cameraMatrix = cameraMatrix * rollRotation * pitchRotation * yawRotation;
Matrix4x4<float> invCameraMat;
invCameraMat = cameraMatrix.OrthoNormalInverse();
glMultMatrixf(invCameraMat.asArray);
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
32602 次 |
| 最近记录: |