使用 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 绘制圆,半径超出比例的主要内容,如果未能解决你的问题,请参考以下文章

openGL 如何同时在屏幕上画两个圆

画一个圆的半径和点周围的边缘

CSS ONLY 动画绘制圆与边框半径和透明背景

在地图上以米为单位绘制圆

在百度地图中,已知圆的圆心坐标、 和圆的半径(单位:米),怎么计算圆的坐标范围?

如何用增加的半径填充圆?