如何使用opengl绘制螺旋

cod*_*max 8 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();
}
Run Code Online (Sandbox Code Playgroud)

如果我不包括z项,我会得到一个完美的圆,但是当我包含z时,我得到3个点就是它.可能发生了什么?

我使用glviewport(0,0,w,h)设置视口

要包括z我应该做什么来设置z方向的视口?

cat*_*try 14

你看点是因为你正在绘制点glBegin(GL_POINTS).尝试替换它glBegin(GL_LINE_STRIP).

注意:当您看到圆圈时,您也只绘制了点,但绘制得足够近以显示为连接圆.

此外,您可能没有设置深度缓冲区来接受您使用的范围z = [-50,310]中的值.这些参数应提供zNearzFar在裁剪平面gluPerspective,glOrtho()glFrustum()调用.

注意:这可以解释为什么使用z值只能看到几个点:其他点被剪裁,因为它们在z缓冲区范围之外.

在您显示您的代码后更新:

glOrtho(-100*aspectratio,100*aspectratio,-100,100,1,-1);只允许[-1,1]范围内的z值,这就是为什么只有三个点z = -1,z = 0并且z = 1将被绘制(因此3点).

最后,您可能从顶部查看螺旋,直接在旋转轴的方向上查看.如果您没有使用透视投影(但是使用等角投影),螺旋仍将显示为圆形.您可能想要更改视图gluLookAt().

设置视角的例子

以下代码取自NeHe的优秀OpenGL教程:

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
Run Code Online (Sandbox Code Playgroud)

然后,在你的绘制循环中看起来像这样:

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();    
Run Code Online (Sandbox Code Playgroud)

当然,您应该根据需要更改此示例代码.