四边形的模型视图矩阵
Model view matrix for a quad
对于我的图形项目,我正在尝试实现一个小地图。与我通常的对象不同,我认为我可以在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 调用完成之前放置在绘图代码中。
相关文章:
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何根据模型设置的视图调整模型?
- Qml 列表视图在重置模型时保留视图
- 为 QML 树视图创建模型
- C++模型视图设计
- 如何从模型/视图中获取QImage POINTER
- 更新模型/视图方案中 QXXXView (QTableView, QTreeView,..) 元素的显示工具提示
- MFC在切换视图时如何关闭无模型对话框
- 从角度转换为正交保持相同的模型和缩放的视图大小
- Qt中数据类(模型)和视图/控制器类之间的数据通信的正确方式是什么
- Qt:从视图中删除模型
- Qt:模型/视图框架上的数据转换
- 根据用户的视图更改更新模型
- 多个模型视图矩阵
- 垂直列表视图中的水平列表视图模型
- 具有两种不同视图的Qt数据模型
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- 了解Qt视图模型架构:何时创建以及如何在QAbstractItemModel实现中清除索引
- Qt中刷新视图模型
- 现代OpenGL投影视图模型转换不起作用