关于Direct3D中的相机功能D3DXMatrixLookAtLH()

时间:2013-08-19 08:15:14

标签: matrix directx direct3d

在函数D3DXMatrixLookAtLH()的描述中,x轴等于“normal(cross(UpVec,z-axis))”,因为我们知道z轴是正常的结果(AtVec - EyePosVec)大多数时候,我们可以毫无问题地计算矩阵。

然而, UpVec 通常是(0,1,0),在特殊情况下,z轴和UpVec可以并联。所以(我认为)我们不能建立一个正确的相机基础,因为y轴和x轴将是向量。那么,我们如何解决这个问题呢?或者我有什么不对劲?

2 个答案:

答案 0 :(得分:2)

为了定义视图转换,您需要计算标准正交基。这是一组基本向量,彼此垂直且具有单位长度。

通过标准化矢量可以很容易地实现单位长度标准。

交叉积用于使矢量正交。正如您已经提到的那样,x向量首先被正交化,然后通过正交化来重新计算向上向量。

x轴(右方向)始终取决于视图方向和向上矢量。如果我们假设上向量为(0,1,0),则x轴仅取决于视图方向。以下是一些示例(视图方向始终在同一平面中)

View visualization

当视图方向通过向上矢量并改变其侧面时,您会看到右矢量翻转。这就是为什么如果向上矢量和视图方向平行则计算失败的原因。无法确定右向量应指向的位置(导致零交叉积)。如果使用这些矢量渲染场景,您会注意到当视图方向通过向上矢量时图像将水平翻转。

如果要指定与y轴平行的视图方向,则必须提供非平行向上矢量。有了它,就可以计算出合理的右矢量。

当然,如果要使用up = cross(direction, right)修复某个正确的向量,可以计算向上向量。

答案 1 :(得分:1)

  

所以(我认为)我们无法建立一个正确的相机基础,因为y轴   和x轴将是零矢量。

是的,当你做如下特殊情况时会发生这种情况。

lookAt = D3DXVector3(0, 0, 0);
eyePos = D3DXVector3(0, Y, 0);

准确地说,结果不是一个不正确的矩阵,它只是一个矩阵,你会看到你的场景。

  

那么,我们如何解决这个问题?

你应该采取反应来防止这种情况发生。