对于我的图形项目,我试图实现小地图。与我通常的对象不同,我想我可以在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));
不幸的是,这不起作用。小地图可以正确缩放并放在右上角但是没有到边界的距离(甚至是负面的距离)。
答案 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调用依赖于所设置的视口完成之前。