使用 GL_POLYGON 绘制圆,半径超出比例
Posted
技术标签:
【中文标题】使用 GL_POLYGON 绘制圆,半径超出比例【英文标题】:Drawing circle with GL_POLYGON, radius out of scale 【发布时间】:2017-09-16 22:16:08 【问题描述】:我正在尝试使用GL_POLYGON
绘制一个圆,我尝试的代码正在运行,但圆的半径似乎与窗口大小不相符,我不明白为什么。
代码如下:
void display()
glClear(GL_COLOR_BUFFER_BIT);
if(start == OFF)
//Set Drawing Color - Will Remain this color until otherwise specified
glColor3f(0.2, 0.3, 0.5); //Some type of blue
//Draw Circle
glBegin(GL_POLYGON);
for(double i = 0; i < 2 * PI; i += PI / 24)
glVertex3f((cos(i) * radius) + gX,(sin(i) * radius) + gY, 0.0);
glEnd();
//Draw Circle
center_x = gX;
center_y = gY;
glutSwapBuffers();
和初始化函数:
void init (void)
/* selecionar cor de fundo (preto) */
glClearColor (0.0, 0.0, 0.0, 0.0);
/* inicializar sistema de viz. */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
我将窗口大小设置为 600,半径设置为 1,四分之一的圆带我们整个窗口。我猜我必须对半径进行某种转换,我只是不知道如何。
【问题讨论】:
是gluLookAt的z坐标吗? 您正在定义一个转换:从世界坐标到视图(或相机,或眼睛)坐标。你用lookAt
矩阵来做。您没有使用投影变换。你的最终坐标在 NDC 中,它是一个 2x2x2 大小的盒子。您应该了解这些和其他转换,例如旋转和缩放。
我改了一点代码删除了looAt,但是现在圆圈更大了,四分之一占据了整个窗口。 @里皮2
再一次,按照一本好的教程或书籍学习转换。顺便说一句,摆脱“固定管道”并使用“现代 Opengl”(版本 >= 3.2)
【参考方案1】:
投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。它从眼睛空间变换到剪辑空间,剪辑空间中的坐标通过除以剪辑坐标的w
分量转换为标准化设备坐标(NDC)。 NDC 的范围是 (-1,-1,-1) 到 (1,1,1)。
在正交投影中,眼睛空间中的坐标被线性映射到标准化的设备坐标。
可以通过glOrtho
设置正交投影。您正在设置一个视口,其左下角位于 (0, 0),右上角位于 (1, 1),深度范围为 -1 到 1:
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
如果你想设置一个允许你在窗口大小比例中绘制的投影,那么你必须这样做:
int wndWidth = 800; // for example a window with the size 800*600
int wndHeight = 600;
glOrtho( 0.0, (float)wndWidth, 0.0, (float)wndHeight, -1.0, 1.0 );
如果你想让 (0, 0) 的原点在窗口的中心,那么你必须这样做:
float w = (float)wndWidth/2.0f;
float h = (float)wndHeight/2.0f;
glOrtho( -w, w, -h, h, -1.0, 1.0 );
进一步了解:
Transform the modelMatrix Both depth buffer and triangle face orientation are reversed in OpenGL【讨论】:
帮助很大!谢谢! @Rabbid76【参考方案2】:如果 Rabbid76 的回答(日期时间戳:2017-09-17T07:10)尚未解决您的问题,请同时使用以下计算机指令进行验证:
将窗口宽度和高度设置为您使用的值,例如600x600
例子:
int iWindowWidth=600;
int iWindowHeight=600;
glScalef(iWindowHeight/(iWindowWidth*1.0f), 1.0f, 1.0f);
//Draw Circle
glBegin(GL_POLYGON);
for(double i = 0; i < 2 * PI; i += PI / 24)
glVertex3f((cos(i) * radius) + gX,(sin(i) * radius) + gY, 0.0);
glEnd();
//reset scaled shape
glScalef(1.0f, 1.0f, 1.0f);
提醒:我们需要将整数,即整数,转换为浮点数,即带分数的数字。
我们添加:(iWindowWidth*1.0f)
这是由于iWindowHeight/iWindowWidth
,例如1366/768 = 0.5622...
,即不是整数
谢谢。
【讨论】:
请注意,处理纵横比的常用方法是使用适当的Projection 矩阵,而不是比例。 (既然答案被接受了,问题就很可能解决了。) 您好,是的,您的答案已收到复选标记,表示它解决了 emic 的问题(日期时间戳:20170916T2216)。在我们的例子中,尽管有同样的问题,但我写的作为答案的技术解决了我们的问题。关于使用投影矩阵,我们也使用它。以上是关于使用 GL_POLYGON 绘制圆,半径超出比例的主要内容,如果未能解决你的问题,请参考以下文章