glm::lookAt 给出二维轴的意外结果
glm::lookAt gives unexpected result for 2D axis
基本上我有一个本地 space,其中 y 指向下方,x 指向右侧,例如
|
|
---------> +x
|
| +y
中心在(320, 240),所以左上角是(0,0)。一些窗口系统使用它。
所以我有这个代码
auto const proj = glm::ortho(0.0f, 640.0f, 0.0f, 480.0f);
auto const view = glm::lookAt(
glm::vec3(320.0f, 240.0f, -1.0f), //eye position
glm::vec3(320.0f, 240.0f, 0.0f), //center
glm::vec3(0.0f, -1.0f, 0.0f) //up
);
我想我需要从z的负位置向z的正位置看(320,240,0),并且“向上”方向是负y。
但是它似乎没有提供正确的结果
auto const v = glm::vec2(320.0f, 240.0f);
auto const v2 = glm::vec2(0.0f, 0.0f);
auto const v3 = glm::vec2(640.0f, 480.0f);
auto const result = proj * view * glm::vec4(v, 0.0f, 1.0f); //expects: (0,0), gives (-1,-1)
auto const result2 = proj * view * glm::vec4(v2, 0.0f, 1.0f); //expects: (-1,1), gives (-2,0)
auto const result3 = proj * view * glm::vec4(v3, 0.0f, 1.0f); //expects: (1,-1), gives (0,-2)
视图和投影不是这样工作的。视图矩阵告诉您哪个点应该映射到视图 space 中的 [0,0]。似乎您尝试将可见区域的中心映射到 [0,0],但随后您使用的投影矩阵假定 [0,0] 是 top-left 角。
由于您首先应用了视图矩阵,因此得到了 view * glm::vec4(v, 0.0f, 1.0f) = [0,0]
的结果。然后在您将 0,0 定义为 top-left 角的位置应用投影矩阵,因此 proj * [0,0]
将导致 [-1,-1].
我不是 100% 确定你想要实现什么,但是如果你想使用给定的投影矩阵,那么视图矩阵必须以 top-left 点的方式转换场景可见区域被映射到 [0,0].
您还可以调整项目以使用范围 [-320, 320](分别为 [-240, 240]),并使用视图矩阵将中心映射到 [0,0]。
基本上我有一个本地 space,其中 y 指向下方,x 指向右侧,例如
|
|
---------> +x
|
| +y
中心在(320, 240),所以左上角是(0,0)。一些窗口系统使用它。
所以我有这个代码
auto const proj = glm::ortho(0.0f, 640.0f, 0.0f, 480.0f);
auto const view = glm::lookAt(
glm::vec3(320.0f, 240.0f, -1.0f), //eye position
glm::vec3(320.0f, 240.0f, 0.0f), //center
glm::vec3(0.0f, -1.0f, 0.0f) //up
);
我想我需要从z的负位置向z的正位置看(320,240,0),并且“向上”方向是负y。
但是它似乎没有提供正确的结果
auto const v = glm::vec2(320.0f, 240.0f);
auto const v2 = glm::vec2(0.0f, 0.0f);
auto const v3 = glm::vec2(640.0f, 480.0f);
auto const result = proj * view * glm::vec4(v, 0.0f, 1.0f); //expects: (0,0), gives (-1,-1)
auto const result2 = proj * view * glm::vec4(v2, 0.0f, 1.0f); //expects: (-1,1), gives (-2,0)
auto const result3 = proj * view * glm::vec4(v3, 0.0f, 1.0f); //expects: (1,-1), gives (0,-2)
视图和投影不是这样工作的。视图矩阵告诉您哪个点应该映射到视图 space 中的 [0,0]。似乎您尝试将可见区域的中心映射到 [0,0],但随后您使用的投影矩阵假定 [0,0] 是 top-left 角。
由于您首先应用了视图矩阵,因此得到了 view * glm::vec4(v, 0.0f, 1.0f) = [0,0]
的结果。然后在您将 0,0 定义为 top-left 角的位置应用投影矩阵,因此 proj * [0,0]
将导致 [-1,-1].
我不是 100% 确定你想要实现什么,但是如果你想使用给定的投影矩阵,那么视图矩阵必须以 top-left 点的方式转换场景可见区域被映射到 [0,0].
您还可以调整项目以使用范围 [-320, 320](分别为 [-240, 240]),并使用视图矩阵将中心映射到 [0,0]。