四边形的模型视图矩阵

Model view matrix for a quad

本文关键字:视图 模型 四边形      更新时间:2023-10-16

对于我的图形项目,我正在尝试实现一个小地图。与我通常的对象不同,我认为我可以在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));

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

与其摆弄顶点坐标变换,我建议更简单的东西?只需将视口本身移动到所需的窗口角和大小:

glViewport(
    lower_left_corner_in_the_window_in_pixels,
    lower_right_corner_in_the_window_in_pixels,
    width_in_pixels,
    height_in_pixels )

如果你的初始虽然在这个"我应该怎么做?我在调整大小(调整形状)功能中设置了视口",那么你做错了。所有对glViewport的调用都属于绘图过程,即应该在依赖于所设置视口的 OpenGL 调用完成之前放置在绘图代码中。