c++ - 在屏幕尺寸变化时保持几何体完整

标签 c++ opengl graphics screen-resolution

我做了一些像这样的形状:

// Triangle
glBegin(GL_TRIANGLES);
    glVertex3f(0.0,0.0,0);
    glVertex3f(1.0,0.0,0);
    glVertex3f(0.5,1.0,0);
glEnd();

// Cube using GLUT
glColor3f(0.0,0.0,1.0);
glutSolidCube(.5);

// Circle
glPointSize(2);
glColor3f(1.0,0.0,1.0);
glBegin(GL_POINTS);

float radius = .75;

for( float theta = 0 ; theta < 360 ; theta+=.01 )
    glVertex3f( radius * cos(theta), radius * sin(theta), 0  );

glEnd();

最初我将窗口大小保持为 500x500,输出如下所示:enter image description here

但是,如果我更改小部件的宽度和高度(不按比例),形状就会变形(圆形看起来是椭圆形,等边三角形看起来是等腰):enter image description here

这是小部件更新代码:

void DrawingSurface::resizeGL(int width, int height)
{ 
   // Update the drawable area in case the widget area changes
   glViewport(0, 0, (GLint)width, (GLint)height);
}

我知道我可以让视口(viewport)本身保持相同的宽度和高度,但这样会浪费很多空间。

问。对此有什么解决方案吗?

问。游戏开发者通常如何处理这个问题,为不同的分辨率设计 OpenGL 游戏?

附言:我知道这不是现代 OpenGL,而且还有更好的方法来制作圆圈。

最佳答案

他们通过使用投影矩阵来解决这个问题,透视矩阵和正射投影传统上都有一种获取纵横比(宽度/高度)并使用它来调整屏幕上结果的方法。

关于c++ - 在屏幕尺寸变化时保持几何体完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28038456/

相关文章:

java - 绘图更新错误 - JMathPlot

c# - 是否有任何选项可以为 Xna 选择纹理过滤

math - 点序列插值

c++ - 电影坐标到世界坐标

opengl - 有没有办法强制 GLUtessellator 只使用 GL_TRIANGLES?

c++ - 使用四元数方向的第一人称相机中的夹紧间距

c++ - 为什么 CPP 项目模板没有出现在 visual studio 2022 中?

c++ - 调整 native 窗口大小

c++ - 这是按内存地址对两个变量进行数字排序的有效方法吗?

c++ - -llibrary 如何确定和定位对象文件名