如何使用opengl绘制螺旋

时间:2009-12-14 17:43:40

标签: 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术语,我会得到一个完美的圆圈但是当我包含z时,我会得到3个点就是它。可能发生了什么?

我使用glviewport(0,0,w,h)

设置视口

要包含z我应该做什么来在z方向设置视口吗?

3 个答案:

答案 0 :(得分:14)

您会看到积分,因为您使用glBegin(GL_POINTS)绘制点数。 请尝试将其替换为glBegin(GL_LINE_STRIP)

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

此外,您可能没有设置深度缓冲区来接受您使用的范围z = [-50,310]中的值。这些参数应在gluPerspectiveglOrtho()glFrustum()来电中作为 zNear zFar 剪裁平面提供。

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

在您显示代码后更新:

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

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

设定视角的例子

以下code取自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

然后,在你的draw loop看起来像这样:

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();    

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

答案 1 :(得分:1)

catchmeifyoutry提供了一种功能完善的方法,但不会绘制空间精确的3D螺旋,因为任何使用GL_LINE基元类型的渲染调用都会栅格化为固定的像素宽度。这意味着当您更改透视图/视图时,线条不会更改宽度。为了实现此目的,请将几何着色器与GL_LINE_STRIP_ADJACENCY结合使用,以创建可以像任何其他3D几何体一样进行栅格化的3D几何体。 (这确实要求您使用post固定功能管道)

我建议你首先尝试catchmeifyoutry的方法,因为它会更简单。如果您不满意,请尝试我描述的方法。您可以使用以下帖子作为指导:

http://prideout.net/blog/?tag=opengl-tron

答案 2 :(得分:1)

这是我在C中的螺旋函数。这些点被保存到一个列表中,可以通过OpenGL轻松绘制(例如,用GL_LINES连接列表中的相邻点)。

  • cx,cy ...螺旋中心x和y坐标
  • r ...最大螺旋半径
  • num_segments ...螺旋将具有的段数

    SOME_LIST* UniformSpiralPoints(float cx, float cy, float r, int num_segments)
    {
    SOME_LIST *sl = newSomeList();
    int i;
    
    for(i = 0; i < num_segments; i++)
    {
    float theta = 2.0f * 3.1415926f * i / num_segments; //the current angle
    
    float x = (r/num_segments)*i * cosf(theta); //the x component
    float y = (r/num_segments)*i * sinf(theta); //the y component
    
    //add (x + cx, y + cy) to list sl
    
    }
    return sl; 
    }
    

r = 1,num_segments = 1024的示例图像:

enter image description here

P.S。使用cos(double)和cosf(float)有区别。      您将float变量用于双函数cos。