glm::lookAt为2D轴提供了意外的结果



基本上,我有一个局部空间,y向下,x向右,就像一样

|
|
---------> +x
|
| +y

中心在(320240(,所以左上角是(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看(320240,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)

视图和投影不是这样工作的。视图矩阵告诉应将哪个点映射到视图空间中的[0,0]。看起来你试图将可见区域的中心映射到[0,0],但随后你使用了一个投影矩阵,该矩阵假设[0,0]是左上角。

由于第一次应用视图矩阵,因此会得到view * glm::vec4(v, 0.0f, 1.0f) = [0,0]的结果。然后应用投影矩阵get,将0,0定义为左上角,因此proj * [0,0]将产生[-1,-1]。

我不能100%确定你想要实现什么,但如果你想使用给定的投影矩阵,那么视图矩阵必须以可见区域左上角映射到[0,0]的方式变换场景。

您还可以调整项目以使用范围[-320320](分别为[-240240](,并使用视图矩阵将中心映射到[0,0]。

最新更新