四边形的模型视图矩阵

时间:2016-01-24 19:15:26

标签: c++ opengl matrix graphics 3d

对于我的图形项目,我试图实现小地图。与我通常的对象不同,我想我可以在OpenGL的默认摄像机坐标系中指定顶点坐标。 所以我的顶点位于(-1,1,0)(1,1,0)(-1,-1,0)(1,-1,0)。我没有使用投影矩阵来计算gl_Position。如果我不使用模型视图矩阵,则具有这4个顶点的四边形将填满整个屏幕(如预期的那样)。现在,我想将此四边形缩放到100x100像素,并将其放在视口的右上角,距视口边界40的距离。

我尝试设置模型视图矩阵,如下所示:

// Move to upper right corner - targetDistance
translate(vec3((viewportWidth - targetDistance) / viewportWidth, (viewportHeight - targetDistance) / viewportHeight), 0.0)
// Move upper right corner to origin
* translate(vec3(-0.5*targetWidth / viewportWidth,-0.5*targetHeight / viewportWidth, 0.0)
// Scale to desired size
* scale(vec3(targetWidth / viewportWidth, targetHeight / viewportHeight, 0.0)

相应的CPP代码如下所示(使用glm)。

glm::uvec2 viewportSize = this->camera->getViewportSize();
const float targetWidth = 100;
const float targetHeight = 100;
const float targetDistance = 40;

glm::mat4 modelViewMatrix =
  glm::translate(
      glm::vec3((viewportSize.x - targetDistance) / viewportSize.x,
                (viewportSize.y - targetDistance) / viewportSize.y, 0.0)) *
  glm::translate(glm::vec3(-0.5f * targetWidth / viewportSize.x,
                           -0.5f * targetHeight / viewportSize.y, 0.0f)) *
  glm::scale(glm::vec3(targetWidth / viewportSize.x,
                       targetHeight / viewportSize.y, 0.0f));

不幸的是,这不起作用。小地图可以正确缩放并放在右上角但是没有到边界的距离(甚至是负面的距离)。

1 个答案:

答案 0 :(得分:0)

而不是摆弄顶点坐标转换,我建议更简单一些?只需将视口本身移动到窗口所需的角落和大小:

glViewport(
    lower_left_corner_in_the_window_in_pixels,
    lower_right_corner_in_the_window_in_pixels,
    width_in_pixels,
    height_in_pixels )

如果你的初始虽然在这个“我应该怎么做?我在resize(reshape)函数中设置视口”然后你做错了。所有对glViewport的调用都属于绘图过程,即应该放在绘图代码中,就在OpenGL调用依赖于所设置的视口完成之前。