2

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

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

4

2 回答 2

2

为了定义视图变换,您需要计算正交基。这是一组相互垂直且具有单位长度的基向量。

单位长度标准可以很容易地通过对向量进行归一化来实现。

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

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

查看可视化

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

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

当然,如果你想用 固定某个右向量,你可以计算上向量up = cross(direction, right)

于 2013-08-19T10:06:39.987 回答
1

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

是的,当您进行如下特殊情况时,就会发生这种情况。

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

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

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

您应该采取应对措施以防止这种情况发生。

于 2013-08-19T09:39:20.223 回答