簡體   English   中英

如何使用opengl繪制螺旋

[英]how to draw a spiral using 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方向的視口?

你看點是因為你用glBegin(GL_POINTS)繪制點。 嘗試用glBegin(GL_LINE_STRIP)替換它。

注意:當您看到圓圈時,您也只繪制了點,但繪制得足夠近以顯示為連接圓。

此外,您可能沒有設置深度緩沖區來接受您使用的范圍z = [ - 50,310]中的值。 這些參數應在gluPerspectiveglOrtho()glFrustum()調用中作為zNearzFar剪裁平面提供。

注意:這可以解釋為什么使用z值只能看到幾個點:其他點被剪裁,因為它們在z緩沖區范圍之外。

在您顯示您的代碼后更新:

glOrtho(-100*aspectratio,100*aspectratio,-100,100,1,-1); 只允許[-1,1]范圍內的z值,這就是為什么只繪制z = -1z = 0z = 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

然后,在你的繪制循環中看起來像這樣:

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

當然,您應該根據需要更改此示例代碼。

catchmeifyoutry提供了一種功能完善的方法,但不會繪制空間精確的3D螺旋,因為任何使用GL_LINE基元類型的渲染調用都會柵格化為固定的像素寬度。 這意味着當您更改透視圖/視圖時,線條不會更改寬度。 為了實現此目的,請將幾何着色器與GL_LINE_STRIP_ADJACENCY結合使用,以創建可以像任何其他3D幾何體一樣進行柵格化的3D幾何體。 (這確實要求您使用post固定功能管道)

我建議你首先嘗試catchmeifyoutry的方法,因為它會更簡單。 如果您不滿意,請嘗試我描述的方法。 您可以使用以下帖子作為指導:

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

這是我在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的示例圖像:

在此輸入圖像描述

PS使用cos(double)和cosf(float)有區別。 您將float變量用於double函數cos。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM