как потянуть спираль с помощью opengl

Я хочу знать, как потянуть спираль.

Я написал этот код:

void RenderScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    GLfloat x,y,z = -50,angle;
    glBegin(GL_POINTS);

    for(angle = 0; angle < 360; angle += 1)
    {   
        x = 50 * cos(angle);
        y = 50 * sin(angle);
        glVertex3f(x,y,z);
        z+=1;
    }
    glEnd();
    glutSwapBuffers();
}

Если я не включаю условия z, я получаю A Perfect Circle, но когда я включаю z, то я получаю 3 точки вот именно. Что, возможно, произошло?

Я установил область просмотра с помощью glviewport (0,0, w, h)

Для включения z, я должен сделать что-нибудь для установки области просмотра в z направлении?

8
задан genpfault 19 September 2013 в 14:32
поделиться

1 ответ

Вы видите точки, потому что вы рисуете их с помощью glBegin (GL_POINTS) . Попробуйте заменить его на glBegin (GL_LINE_STRIP) .

ПРИМЕЧАНИЕ: когда вы увидели круг, вы также нарисовали только точки, но нарисованы достаточно близко, чтобы выглядеть как соединенный круг.

Кроме того, возможно, вы не настроили буфер глубины для приема значений в диапазоне z = [-50, 310], который вы используете. Эти аргументы должны быть представлены как плоскости отсечения zNear и zFar в вашем gluPerspective , glOrtho () или glFrustum () .

ПРИМЕЧАНИЕ: это объясняет, почему при значении z вы видите только несколько точек: другие точки обрезаются, потому что они находятся за пределами диапазона z-буфера.

ОБНОВЛЕНИЕ ПОСЛЕ ПОКАЗАНИЯ ВАШЕГО КОД:

glOrtho (-100 * соотношение сторон, 100 * соотношение сторон, -100,100,1, -1); допускает только z-значения в диапазоне [-1, 1], поэтому будут нарисованы только три точки с z = -1 , z = 0 и z = 1 (таким образом, 3 точки).

Наконец, вы, вероятно, смотрите на спираль сверху, глядя прямо в направлении оси вращения. Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Вы можете захотеть изменить свое представление с помощью gluLookAt () .

ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ

Следующий код взят из превосходных руководств по OpenGL от NeHe:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
glLoadIdentity();                           // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);                     // Select The Modelview Matrix
glLoadIdentity();                           // Reset The Modelview Matrix

Тогда в вашем цикле отрисовки будет выглядеть примерно так:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Clear The Screen And The Depth Buffer
glLoadIdentity();   
glTranslatef(-1.5f,0.0f,-6.0f);                 // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES);                      // Drawing Using Triangles
    glVertex3f( 0.0f, 1.0f, 0.0f);              // Top
    glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
    glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
glEnd();    

Конечно, вы должны изменить этот пример кода по своему усмотрению.

z = 0 и z = 1 будут нарисованы (то есть 3 точки).

Наконец, вы, вероятно, смотрите на спираль сверху, глядя прямо в направлении ось вращения. Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Возможно, вы захотите изменить свое представление с помощью gluLookAt () .

ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ

Следующий код взят из превосходных руководств по OpenGL от NeHe:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
glLoadIdentity();                           // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);                     // Select The Modelview Matrix
glLoadIdentity();                           // Reset The Modelview Matrix

Тогда в вашем цикле отрисовки будет выглядеть примерно так:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Clear The Screen And The Depth Buffer
glLoadIdentity();   
glTranslatef(-1.5f,0.0f,-6.0f);                 // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES);                      // Drawing Using Triangles
    glVertex3f( 0.0f, 1.0f, 0.0f);              // Top
    glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
    glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
glEnd();    

Конечно, вы должны изменить этот пример кода по своему усмотрению.

z = 0 и z = 1 будут нарисованы (то есть 3 точки).

Наконец, вы, вероятно, смотрите на спираль сверху, глядя прямо в направлении ось вращения. Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Вы можете захотеть изменить свое представление с помощью gluLookAt () .

ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ

Следующий код взят из превосходных руководств по OpenGL от NeHe:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
glLoadIdentity();                           // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);                     // Select The Modelview Matrix
glLoadIdentity();                           // Reset The Modelview Matrix

Тогда в вашем цикле отрисовки будет выглядеть примерно так:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Clear The Screen And The Depth Buffer
glLoadIdentity();   
glTranslatef(-1.5f,0.0f,-6.0f);                 // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES);                      // Drawing Using Triangles
    glVertex3f( 0.0f, 1.0f, 0.0f);              // Top
    glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
    glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
glEnd();    

Конечно, вы должны изменить этот пример кода по своему усмотрению.

Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Вы можете захотеть изменить свое представление с помощью gluLookAt () .

ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ

Следующий код взят из превосходных руководств по OpenGL от NeHe:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
glLoadIdentity();                           // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);                     // Select The Modelview Matrix
glLoadIdentity();                           // Reset The Modelview Matrix

Тогда в вашем цикле отрисовки будет выглядеть примерно так:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Clear The Screen And The Depth Buffer
glLoadIdentity();   
glTranslatef(-1.5f,0.0f,-6.0f);                 // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES);                      // Drawing Using Triangles
    glVertex3f( 0.0f, 1.0f, 0.0f);              // Top
    glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
    glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
glEnd();    

Конечно, вы должны изменить этот пример кода по своему усмотрению.

Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Возможно, вы захотите изменить свое представление с помощью gluLookAt () .

ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ

Следующий код взят из превосходных руководств по OpenGL от NeHe:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
glLoadIdentity();                           // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);                     // Select The Modelview Matrix
glLoadIdentity();                           // Reset The Modelview Matrix

Тогда в вашем цикле отрисовки будет выглядеть примерно так:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Clear The Screen And The Depth Buffer
glLoadIdentity();   
glTranslatef(-1.5f,0.0f,-6.0f);                 // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES);                      // Drawing Using Triangles
    glVertex3f( 0.0f, 1.0f, 0.0f);              // Top
    glVertex3f(-1.0f,-1.0f, 0.0f);              // Bottom Left
    glVertex3f( 1.0f,-1.0f, 0.0f);              // Bottom Right
glEnd();    

Конечно, вы должны изменить этот пример кода по своему усмотрению.

14
ответ дан 5 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: