2017-04-14 11 views
0

OpenGLを使用してゼロから球を描画しようとしています。この関数はvoid drawSphere(float radius, int nSegments, int nSlices)として定義され、(0、0、0)の原点を中心にする必要があり、GL_QUADSを使用して作成する必要があります。四辺形を使用して球を描画するアルゴリズム

最初に、球体を作るために互いに積み重ねられた先細の円筒形の種類の「スライス」があり、「セグメント」は壁/側面を生成するために円で生成された四角形ですこれらのテーパ付きシリンダスライスのそれぞれについて?

第2に、四角形を使用してこの球を生成する計算をどのように行うかについてのアルゴリズムや例は見当たりません。ほとんどの例は、代わりに三角形から生成されるようです。ここで

は、私はちょうど右方向に間違いなくある、試みたが、私の計算を調整したものである

EDITはどこかオフになっている:

void drawSphere(float radius, int nSegments, int nSlices) { 
    /* 
    * TODO 
    * Draw sphere centered at the origin using GL_QUADS 
    * Compute and set normal vectors for each vertex to ensure proper shading 
    * Set texture coordinates 
    */ 

    for (float slice = 0.0; slice < nSlices; slice += 1.0) { 
     float lat0 = M_PI * (((slice - 1)/nSlices) - 0.5); 
     float z0 = sin(lat0); 
     float zr0 = cos(lat0); 

     float lat1 = M_PI * ((slice/nSlices) - 0.5); 
     float z1 = sin(lat1); 
     float zr1 = cos(lat1); 

     glBegin(GL_QUADS); 

     for (float segment = 0.0; segment < nSegments; segment += 1.0) { 
      float long0 = 2 * M_PI * ((segment -1)/nSegments); 
      float x0 = cos(long0); 
      float y0 = sin(long0); 

      float long1 = 2 * M_PI * (segment/nSegments); 
      float x1 = cos(long1); 
      float y1 = sin(long1); 

      glVertex3f(x0 * zr0, y0 * zr0, z0); 
      glVertex3f(x1 * zr1, y1 * zr1, z0); 
      glVertex3f(x0 * zr0, y0 * zr0, z1); 
      glVertex3f(x1 * zr1, y1 * zr1, z1); 
     } 

     glEnd(); 
    } 
} 

答えて

0

私はradiusが使用されて見ていませんよ。おそらく簡単な省略。残りの計算では半径は1と仮定しましょう。(x、y)と(z、zr)の両方で0-1を使用して4つの値を生成する必要があります。

x1 * zr1, y1 * zr1, z0は、zr1z0が混在しているため正しくありません。このベクトルのノルムはもはや1ではないことがわかります。あなたの4つの値は、私は、私はクワッドが、三角形を使用していないので、順序についてあまりよく分からない

x0 * zr0, y0 * zr0, z0 
x1 * zr0, y1 * zr0, z0 
x0 * zr1, y0 * zr1, z1 
x1 * zr1, y1 * zr1, z1 

でなければなりません。

+0

ありがとうございます。私はちょうどそれを働かせるために順序と遊ばなければならなかった。また、私は半径の調整をしていないことに気付きました。 'x0'、' x1'、 'y0'、および' y1'は、それぞれ半径 – KOB

関連する問題