gpt4 book ai didi

c++ - OpenGl 和 QT 坐标

转载 作者:行者123 更新时间:2023-11-28 04:38:20 28 4
gpt4 key购买 nike

当我在非 qt 项目中使用 OpenGL 并且我喜欢画一条线时,我使用以下代码:

glMatrixMode(GL_PROJECTION);
glOrtho(0,500,0,500,-1,1);

glBegin(GL_LINES);
glVertex(50, 50);
glVertex2i(200,200);
glEnd();

当我尝试在 qt 上执行此操作时(使用小部件提升),这些数字不正确。

但如果我使用:

glBegin(GL_LINES);
glVertex2f(-0.5, 0.5);
glVertex2f(1, 1);
glEnd();

正如我在很多教程中看到的那样,我没有在这里写 glOrthoglMatrixMode

那么为什么在 windows 或 linux 中坐标与 qt 不同以及如何正确使用它?

最佳答案

首先请注意,OpenGL 矩阵堆栈和使用 glBegin/glEnd 序列的绘图已弃用 10 多年。了解 Fixed Function Pipeline并查看 Vertex Specification最先进的渲染方式。


glOrtho 设置正交投影矩阵。投影矩阵描述了从场景 View 的 3D 点到视口(viewport)上的 2D 点的映射。
在正交投影中, View 空间中的坐标线性映射到裁剪空间坐标,并且裁剪空间坐标等于归一化设备坐标,因为 w 组件为 1(对于笛卡尔输入坐标)。
left、right、bottom、top、near 和 far 的值定义了一个框。盒子体积内的所有几何体在视口(viewport)上都是“可见的”。

orthographic projection

但是glOrhto将 mtrix 堆栈上的当前矩阵与新的正交投影矩阵相乘。

这意味着如果你这样做

glMatrixMode(GL_PROJECTION);
glOrtho(0,500,0,500,-1,1);

在每一帧中,那么投影矩阵都会连续渐进的变化

要将矩阵设置为矩阵堆栈,必须先使用单位矩阵初始化矩阵堆栈:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,500,0,500,-1,1);


另一种可能性是使用 glPushMatrix and glPopMatrix在 renering 的开始和结束时。在改变之前插入矩阵,在渲染之后弹出它。
由于 glOrtho 更改了矩阵堆栈中最顶层的矩阵,glPopMtrix 将“撤消”更改。

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glOrtho(0,500,0,500,-1,1);

// do the rendering here

glPopMatrix();

关于c++ - OpenGl 和 QT 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50805742/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com