我确实理解glm :: LookAt是如何工作的以及它需要什么参数。 我无法理解如何提供正确的向上矢量。
例如,这个:
glm::mat4x4 transformation = glm::lookAt(cameraPosition, targetPosition, glm::vec3(0.f, 1.f, 0.f));
如果我想直接制作相机手表:
mat4x4 transformation = glm::lookAt(vec3(0.f, 1.f, 0.f), vec3(0.f, 0.f, 0.f), vec3(0.f, 1.f, 0.f));
它无效。 Matrix将包含 NaNs (非数字)值! 那么如何为Up vector获得正确的价值?
答案 0 :(得分:3)
你得到NaN的原因是除以零。
引用this post:
向上矢量基本上是一个矢量,用来定义你的世界"向上" 方向。在几乎所有正常情况下,这将是向量(0,1, 0)即朝向正Y.眼睛是相机的位置 观点,中心是你正在看的地方(一个位置)。
设置如何工作?下图说明了:
u
是向上矢量(第三个参数)p
是目标位置(第二个参数)c
是相机位置(第一个参数)d
是方向向量(= p - c
)r
是正确的向量 lookAt
返回视图矩阵,其格式如下:
(其中"帽子"表示标准化 - 长度为1)
由于你只提供向上矢量和(有效地,因为d = p - c
)方向向量,我们必须使用交叉产品计算正确的向量:
(注意以上是在标准化之前)
现在为什么你的例子没有按预期工作。这样的论点:
u = (0, 1, 0)
p = (0, 0, 0)
c = (0, 1, 0)
d = (0, -1, 0)
上面给出了r = d * u = (0, 0, 0)
!这是因为方向和向上矢量是反平行的,而它们之间应该有一个角度,以便日常工作(理想情况下为90度)。当r
被归一化时,除以零,因此矩阵的整个第一行应该被NaN's占用。
(作为一种可能的解决方法,请尝试使用up = (0, 0, 1)
。)