0

OpenGL ライブラリを使用して、それぞれ異なる色のセクターを持つリングを描画したいと考えています。使用できることがわかっているリングを描画するにはgluDisk(gluNewQuadric(), 0, 1.5, 32, 100);

GL_TRIANGLE_FANしかし、セクターまたはゾーンを異なる色で描画するには、手動の方法または同様のものを使用する必要があると思います。

そのように試してみますが、出力はリングに対してそれほど正確ではありません。

const float DEG2RAD = 3.14159/180;

glBegin( GL_TRIANGLE_FAN );
        for( int i = 0; i <= 90; i++ )
        {
           float degInRad = i*DEG2RAD;
           glVertex2f(x, y); // point of the inner circle of the ring

           for( int n = 0; n <= 4; n++ ) 
           {
              float const t = = i*DEG2RAD*(n/4);
              glVertex2f(x + sin(t)*r, y + cos(t)*r);  // points of the outer circle.
           }
        }
glEnd();

アイデアは、この仕組みの図に従ってGL_TRIANGLE_FANおり、内側の円で計算された各ポイントに対して外側の円で 4 つのポイントを取得します。外側の円が内側の円より長いからです。これが、別のループへのループの理由です。

OpenGL 描画の種類

4

1 に答える 1

2

あなたのコードは「内側の円」と「外側の円」を参照していますが、あなたが持っているのは単一の中心点(x、y)だけであり、角度の計算があまり行われないため、外側の円の点はいたるところにあります意味(どこにも使用されていない外側のループで1つの値を計算し、内側のループですべてを乗算して、適切な測定のために4で除算します...それはあなたに与えるつもりはありません円の中の素敵なポイント)。

いずれにせよ、単一の三角形ファンを使用してリングを描くことはできません。これは、ファン内のすべての三角形が 1 つのポイントに接続する必要があるためです。ファンを別の時点で再起動する魔法の方法はありません。glEnd() を実行して新しいファンを起動するだけです。これは、ギャップを残すため、リングの周りを進むにはうまく機能しません。Triangle-fans は、一般に、従来の GL プリミティブの中で最も役に立たないものの 1 つです。

小さい円でより少ないポイントを使用しようとしているのは理解できますが、正直なところ、それが価値があるとは思えません。

あなたの最善の策は、代わりに三角形のストリップを使用し、円の周りに単一のループを使用して、毎回内側と外側の頂点の両方を配置することです。

セグメントの疑似コード:

glBegin(GL_TRIANGLE_STRIP);
for(angle = start_angle; angle < end_angle ; angle += small_increment)
{
    s = sin(angle); c = cos(angle);
    glVertex2f( x + c * r1, y + s * r1);
    glVertex2f( x + c * r2, y + s * r2);
}
glEnd();
于 2012-12-11T15:08:07.890 に答える