使用GL_POLYGON绘制圆,半径超出范围

时间:2017-09-16 22:16:08

标签: c++ opengl geometry orthographic

我正在尝试使用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();
}

和init函数:

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,圆圈的四分之一将我们整个窗口。我猜我必须用半径进行某种变换,我只是不知道如何。

2 个答案:

答案 0 :(得分:1)

投影矩阵描述了从场景的3D点到视口的2D点的映射。它从眼睛空间转换到剪辑空间,并且通过用剪辑坐标的w分量进行划分,将剪辑空间中的坐标转换为规范化设备坐标(NDC)。 NDC在(-1,-1,-1)到(1,1,1)的范围内。

在Orthographic Projection中,眼睛空间中的坐标线性映射到标准化设备坐标。

Orthographic Projection

可以通过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 );

进一步了解:

答案 1 :(得分:0)

如果 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...,即不是整数

谢谢。