【问题标题】:Vertex OpenGL LookAt not showing顶点 OpenGL LookAt 未显示
【发布时间】:2016-03-15 13:11:29
【问题描述】:

我正在使用 GLM 和 GLFW 来绘制一个正方形。我有以下代码:

static const GLfloat g_vertex_buffer_data[] = {
    // square

    0, 0, 0,
    1, 0, 0,
    0, 0, 1,

    1, 0, 0,
    1, 0, 1,
    0, 0, 1,

};

glm::mat4 Projection = glm::perspective(glm::radians(45.0f), (float)_width / (float)_height, 0.1f, 100.0f);

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));

glm::mat4 Model = glm::mat4(1.0f);

glm::mat4 mvp = Projection * View * Model;
GLuint MatrixID = glGetUniformLocation(programID, "MVP");


glm::mat4 MyModel = glm::mat4(1.0f);
glm::mat4 MyMVP = Projection * View * MyModel;

奇怪的事情就在这里:

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));

现在,我什么也没看到。但是当我把它改成这样时:

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.000001f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));

然后我实际上能够看到广场。 为什么当我将 Z 坐标更改为零时看不到它,为什么当我将其更改为 >0 时它会起作用?我实际上希望它为零(所以从 5 个单位到中心点)但是由于某种原因这不起作用。

---编辑---

这是glm::vec3(0.f, 5.f, 0.0000000000001f)

http://bit.ly/251TAC7

这是glm::vec3(0.f, 5.f, 0.000000000000f)的结果

http://bit.ly/1QUqBZz

【问题讨论】:

  • 你的上向量应该是 (0,0,1) 而不是 (0,1,0)。目前您的视图方向和向上矢量是相同的,因此叉积不能很好地工作。当您更改为 0.001f 时,向上矢量可以“近似”。
  • @aslg 这行得通,但是当我像你说的那样改变向上的向量时,它的“意思”是什么?实际发生了什么?顺便修改了一下

标签: opengl glfw glm-math


【解决方案1】:

所以你的lookat设置是错误的。您的相机当前从 (0,5,0) 指向 (0,0,0),向上矢量为 (0,1,0)。

这意味着您的相机正朝负 Y 方向看

normalize( (0,0,0) - (0,5,0) ) = (0,-1,0)

与向上向量的方向相同(反转,但这无关紧要)。显然,您的相机不能指向与向上矢量相同的方向。

要解决您的问题,您只需使用向上向量 (0,0,1)。


这就是您的场景使用正确设置的相机时的样子。 XYZ 是世界参考(你也可以在那里看到你的四边形),UVN 是相机参考。 N 是视图方向,V 是向上向量,U 是平行于 N 和 V 的侧向量。您实际上不必处理相机的 UVN 坐标,因为 GLM 会为您处理,您只需提供世界坐标中的中心点和眼点以及向上向量。

如果您的向上向量与视图方向相同,则它们不能正交,并且相机参考定义不明确。

将中心点更改为 Z = 0.0000001f 而不是 0,从而使向上矢量不完全平行于视图方向。查看函数的实现在某种程度上近似于您提供的向上向量到实际向上向量。这样做是为了让您不必在每次设置相机时都计算准确的向上矢量。

您只需指定向上向量为 (0,0,1),如果您的视图方向碰巧与向上向量不正交,请查看计算向上向量的最佳近似值,以便 UVN 向量仍然是正交的。除非向上向量与视图方向一致,在这种情况下,向上向量可以是任何东西。

如果您不了解相机坐标、向上矢量等,请花点时间查看/阅读。 SO 中也有很好的答案。

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多