регулярный многоугольник opengl - PullRequest
0 голосов
/ 02 июня 2011

У меня есть следующий код, который ничего не рисует. Если я использую glBegin (GL_POINTS), он рисует круг, но в режиме многоугольника это не так.

int WXSIZE=500,WYSIZE=500;

//Coordinate system
float Xmin=-8, Xmax=8, Ymin=-8, Ymax=8;

void setupmywindow()
{
    glClearColor(0,0,0,0);  
    gluOrtho2D(Xmin, Xmax, Ymin, Ymax);
}


void mypolygon(float radius) //test object
{

   glColor3f(1,0,0);
   int numPoints=20;
   float x,y;
   float centerx,centery=0;

    for (int i = 0; i < numPoints; i++)
{
    x = centerx + radius * sin(2.0*PI*i/numPoints);
    y = centery + radius * cos(2.0*PI*i/numPoints);

     glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
     glBegin(GL_POLYGON);
     glVertex2f(x, y);
     glEnd();

}

}


void myDisplay()
//single object
{
    glClear(GL_COLOR_BUFFER_BIT);
    mypolygon(2.0);
    glutSwapBuffers();
}


int main(int argc, char **argv)
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(WXSIZE,WYSIZE);
    glutCreateWindow("My graphic window");
    setupmywindow();
    glutDisplayFunc(myDisplay);
    glutMainLoop();
} 

Есть предложения?

EDIT ----------------------

glBegin(GL_POLYGON);

    for (int i = 0; i < numPoints; i++)
{
    x = centerx + radius * sin(2.0*PI*i/numPoints);
    y = centery + radius * cos(2.0*PI*i/numPoints);

    glVertex2f(x, y);

}
   glEnd();

Я перепутал это с петлей.

Ответы [ 3 ]

4 голосов
/ 02 июня 2011

В каждом цикле вы рисуете многоугольник, который состоит из одной вершины, так что ничего.Просто поместите glBegin/glEndglPolygonMode) вне цикла for и нарисуйте только glVertex в цикле.Конечно, он работает с точками, поскольку одна точка равна n точкам.Но n многоугольника, состоящего из одной точки, не совпадает с одним многоугольником, состоящим из n точек.

3 голосов
/ 02 июня 2011

Ваш полигон, похоже, не на той стороне.По умолчанию OpenGL показывает только лицевые грани, которые необходимо указать против часовой стрелки.Вы можете:

  • Инвертировать порядок ваших примитивов (for (int i = numPoints-1; i >= 0 ; i--))
  • Инвертировать переднюю грань (glFrontFace(GL_CW))
  • Отключить выборку задней грани (glDisable(GL_CULL_FACE)).
0 голосов
/ 02 июня 2011

Когда вы вызываете glBegin с помощью GL_POLYGON, я ожидаю, что я считаю минимум три вершины.Стандартный протокол рисования состоит в том, чтобы рисовать, используя треугольники, вершины ведьм в наборах по три, так как вам нужно три вершины для каждой стороны треугольника.Вы кормите его только одной вершиной, поэтому вы ничего не увидите.Попробуйте изменить это на это:

glBegin(GL_TRIANGLES);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glVertex2f(x3, y3);
glEnd();
...