【问题标题】:Orthographic Projection Matrix - Triangle in wrong place正交投影矩阵 - 三角形在错误的位置
【发布时间】:2015-07-08 16:04:39
【问题描述】:

我试图实现一个正交投影矩阵 - 目前,我要做的就是在屏幕上绘制一个三角形,没有矩阵也可以正常工作,但是只要将坐标乘以矩阵,三角形就不会' t 适合页面(很难解释,但一个点在中心,另外两个远离页面)。我已经尝试了一个不同的矩阵,其中有负坐标(所以屏幕的中心是原点)并且它工作正常 - 我在这里做错了什么吗?相关代码如下:

GLfloat vertices[] = 
{
     -1.0f, -1.0f, 0.0f, 1.0f,
     1.0f, -1.0f, 0.0f, 1.0f,
     0.0f, 1.0f, 0.0f, 1.0f,
};

glm::mat4 projectionMatrix = glm::ortho(0.0f, 960.0f, 640.0f, 0.0f, 1.0f, -1.0f);
glm::mat4 viewMatrix = glm::lookAt(glm::vec3(0,0,5),glm::vec3(0,0,0),glm::vec3(0,1,0));
glm::mat4 modelMatrix = glm::mat4(1.0f);

glm::mat4 PVM = projectionMatrix * viewMatrix * modelMatrix;


GLuint matrixID = glGetUniformLocation(shader.getShaderID(), "PVM");

然后是顶点着色器:

#version 130    

in vec4 vertexPosition;

uniform mat4 PVM;

out vec4 position;

void main()
{
    gl_Position = vertexPosition * PVM;
    position = vertexPosition;
}

我刚刚包含了我认为相关的代码。

【问题讨论】:

  • 您根据什么确定传递给glm::ortho 的值?例如,我看到“底部”大于“顶部”值(第三个参数大于第四个)。这是故意的吗?
  • 通常 glsl/glm 假设 M * v 形式的乘法。除非您在代码中的某处转置矩阵,否则PVM * vertexPosition nicht 可以解决问题。
  • @Nasser,是的,这是故意的——所以原点在左上角,我认为这是 2d 游戏的标准(如果我错了,请纠正我)。
  • @BDL 是的,这似乎确实涉及问题,将其与应用其他建议的内容一起切换似乎可以解决问题。感谢您的帮助

标签: c++ opengl matrix


【解决方案1】:

好吧,如果您使用屏幕分辨率的正交投影,您可能会这样做。顶点坐标变为像素坐标。所以你的三角形只有 2 像素宽,一半在屏幕外。

所以试着把它弄大一点。

【讨论】:

  • 与其他建议一起,是的,这似乎确实有助于解决问题 - 我最初认为三角形的坐标将乘以矩阵,将它们转换为屏幕坐标,但似乎我有误解了。无论如何感谢您的帮助:)
  • @Quimby:实际上,不是一半的三角形在屏幕外,而是全部。它完全位于远平面的后面。
  • @derhass 是的,你是对的,我只检查了相机的方向,而不是距离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多