在函数D3DXMatrixLookAtLH()的描述中,x轴等于“normal(cross(UpVec,z-axis))”,因为我们知道z轴是正常的结果(AtVec - EyePosVec)大多数时候,我们可以毫无问题地计算矩阵。
然而, UpVec 通常是(0,1,0),在特殊情况下,z轴和UpVec可以并联。所以(我认为)我们不能建立一个正确的相机基础,因为y轴和x轴将是零向量。那么,我们如何解决这个问题呢?或者我有什么不对劲?
答案 0 :(得分:2)
为了定义视图转换,您需要计算标准正交基。这是一组基本向量,彼此垂直且具有单位长度。
通过标准化矢量可以很容易地实现单位长度标准。
交叉积用于使矢量正交。正如您已经提到的那样,x向量首先被正交化,然后通过正交化来重新计算向上向量。
x轴(右方向)始终取决于视图方向和向上矢量。如果我们假设上向量为(0,1,0),则x轴仅取决于视图方向。以下是一些示例(视图方向始终在同一平面中)
当视图方向通过向上矢量并改变其侧面时,您会看到右矢量翻转。这就是为什么如果向上矢量和视图方向平行则计算失败的原因。无法确定右向量应指向的位置(导致零交叉积)。如果使用这些矢量渲染场景,您会注意到当视图方向通过向上矢量时图像将水平翻转。
如果要指定与y轴平行的视图方向,则必须提供非平行向上矢量。有了它,就可以计算出合理的右矢量。
当然,如果要使用up = cross(direction, right)
修复某个正确的向量,可以计算向上向量。
答案 1 :(得分:1)
所以(我认为)我们无法建立一个正确的相机基础,因为y轴 和x轴将是零矢量。
是的,当你做如下特殊情况时会发生这种情况。
lookAt = D3DXVector3(0, 0, 0);
eyePos = D3DXVector3(0, Y, 0);
准确地说,结果不是一个不正确的矩阵,它只是一个矩阵,你会看到你的场景。
那么,我们如何解决这个问题?
你应该采取反应来防止这种情况发生。