对于我的图形项目,我试图实现一个小地图。与我通常的对象不同,我想我只需要在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));不幸的是,这不起作用。地图被正确地缩放并放置在右上角,但是与边框没有距离(甚至是负值)。
发布于 2016-01-24 20:37:00
我建议的不是摆弄顶点坐标变换,而是要简单得多?只需将视图本身移动到所需的窗口的角落和大小:
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调用完成之前。
https://stackoverflow.com/questions/34980226
复制相似问题