我正在使用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));
然后我实际上能看到广场。 当我将Zcoördinate更改为零时,为什么我无法看到它,为什么当我将其更改为> 0时它会起作用?我实际上希望它为零(所以从5个单位到中心点看)但是由于某种原因这不起作用。
--- ---编辑
这是glm::vec3(0.f, 5.f, 0.0000000000001f)
这是glm::vec3(0.f, 5.f, 0.000000000000f)
答案 0 :(得分:2)
所以你的外观设置是错误的。您的相机当前从(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也有很好的答案。