-1

gluSphereメソッドを使わずに球を作りたくて、このコードで球を計算してみました

void drawCircle(double x, double y, double r)
{
    glBegin( GL_QUAD_STRIP );

    for(int i=0;i<=360;i++){
        glVertex3d(x+sin(i)*r,y+cos(i)*r,-5.0);
    }
    glEnd();
}
void drawSphere(double x,double y,double r){
    glLoadIdentity();
    glColor3d(1,0,0);
        for(int j=0;j<180;j++){
            glTranslated(0,0,r/180);
            drawCircle(x,y,r*sin(j)); 
        }
}

結果はこんな感じでした

ここに画像の説明を入力

しかし、その結果、私が作った円はうまく整列しませんでした. 球を正しく作るための適切な計算はありますか?

4

2 に答える 2

4

球と円には違いがあります。円は 2 次元の形状であり、球はその 3D の対応物です。コードから、球のポイントを生成していませんが、z は定数、つまり -0.5 であるため、円柱のポイントを生成しています。Sphere の場合、3 つすべてが範囲内で変化するはずです

中心が(xc, yc, zc)にある場合

  • x => (0-xc) < x < (0+xc)
  • y => (0-yc) < y < (0+yc)
  • z => (0-zc) < z < (0+zc)

球は、(u,v) に関してパラメトリックに定義できます。

  • x = xo + r cos(シータ) cos(ファイ)
  • y = yo + r cos(シータ) sin(ファイ)
  • z = zo + r sin(シータ)

ポイントは、x、y、z の有効な組み合わせである必要があります。つまり、3 つのループを使用してポイントを生成できます。そうして初めて、球の正しいポイントが得られます。

また、QuadStrip を使用しているため、渡す配列のポイントの順序が反時計回りである必要があります。そうしないと、正しい形状を取得できません。

sin() & cos() を使用する代わりに、球方程式を使用する必要があります: x*x + y*y + z*z = c*c

于 2013-09-17T15:34:04.693 に答える