我以为我理解矩阵数学很好,但显然我很无能
以下是设置:
我在世界空间的[0,0,0]处有一个物体。我有一个由鼠标移动控制的摄像机类,可以旋转和缩放对象,使它始终可以看到它。以下是我从相机计算viewMatrix的方法:
public Matrix viewMatrix {
get {
return
Matrix.CreateFromAxisAngle(Vector3.Up, rotAngle)
* Matrix.CreateFromAxisAngle(Vector3.Left, pitchAngle)
* Matrix.CreateTranslation(0, 0, distance)
;
}
}
我需要能够将相机的位置放在世界空间中,这样我才能从盒子中获得距离 - 特别是它与盒子每个面的距离。 如何在世界空间坐标中获取相机的xyz位置?
我试过了:
// all of these only return [0, 0, distance];
Vector3 pos = Vector3.Transform(Vector3.Zero, viewMatrix);
Vector3 pos = viewMatrix.Translation;
Vector3 pos = new Vector3(viewMatrix.M41, viewMatrix.M42, viewMatrix.M43);
似乎旋转信息以某种方式丢失。奇怪的是,viewMatrix代码非常适合定位相机!
答案 0 :(得分:7)
或略微简化:
Vector3 pos = Matrix.Invert(view).Translation;
答案 1 :(得分:2)
再次,我在发布问题的几秒钟内找出了问题:
我需要反转视图矩阵。旋转信息 丢失,因为它在距离计算中不起作用,直到视图矩阵被反转。轮换是转型的错误“结束”。
Vector3 pos = Vector3.Transform(Vector3.Zero, Matrix.Invert(viewMatrix));