4

私はopenglレンダリングにfreeglutを使用しています...

円錐 (2D) のようなエンベロープを描画する必要があります。このエンベロープには、色と透明度を適用する必要があります。

freeglut ツールキットには、塗りつぶされたジオメトリ (または何らかのトリック) を描画するための組み込み機能が装備されていますか? または、埋められたジオメトリのサポートが組み込まれている他のAPIがあります..

Edit1: 2Dコーンのことを明確にするために...エンベロープは、(敵航空機の)迎撃中の航空機のカバレッジエリアのグラフィカルな解釈です...それは円のセクターに似ています..セクターについて言及する必要がありました代わりは..

そして、glutSolidConeは、円の塗りつぶされたセクターを描画したいので役に立ちません...これはすでに行っています...残っているのは、それを色で塗りつぶすことです...openglでジオメトリを色で塗りつぶす方法は?

Edit2: この質問に投稿されたすべての回答は、ある意味で私の問題に役立つ可能性があります..しかし、ジオメトリを色で塗りつぶす方法を知りたいと思います. 放物線であるエンベロープを描画したい場合...その場合、実際に塗りつぶされた放物線を描画するためのデフォルトのglut関数はありません(または何かありますか?)..この質問を一般化するには...どのようにカスタム ジオメトリを単色で描画しますか?

Edit3: mstrobl が投稿した回答は GL_TRIANGLES に対して機能しますが、そのようなコードに対しては:

glBegin(GL_LINE_STRIP);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

正方形を描画します...有線の正方形のみが描画されます...青色で塗りつぶす必要があります。

とにかくやる?

パイのような閉じた曲線に描画コマンドをいくつか入れて、それを色で塗りつぶす必要がある場合、それを可能にする方法はありますか...

GL_TRIANGLES でどのように可能かわかりません...しかし、閉じた曲線でそれを行う方法は?

4

5 に答える 5

2

「エンベロープ」の意味はわかりませんが、コーンは、過剰なものが持つプリミティブです。

glutSolidCone(radius, height, number_of_slices, number_of_stacks)

色で塗りつぶす最も簡単な方法は、色で描くことです。ある程度透明にしたいので、アルファ値も必要です。

glColor4f(float red, float green, float blue, float alpha)
// rgb and alpha run from 0.0f to 1.0f; in the example here alpha of 1.0 will
// mean no transparency, 0.0 total transparency. Call before drawing.

半透明にレンダリングするには、ブレンドを有効にする必要があります。また、使用するブレンド機能を設定する必要があります。あなたがやりたいことはおそらく以下で達成されるでしょう。詳細を知りたい場合は、コメントを送ってください。良いポインタを探します。しかし、ここにあなたのセットアップがあります:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

描画操作を行う前に、おそらくプログラムの初期化時に、これを呼び出します。:)

于 2008-10-26T12:24:01.960 に答える
2

そのためのサブルーチンがあったことを覚えています。しかし、自分でやるのも難しいことではありません。

しかし、私は2Dのものを理解していません。2Dでコーン?ただの三角形じゃないですか?

とにかく、これがopenglで円錐を描くためのアルゴリズムです

最初に円を取り、それを均等に分割して、適切な量のエッジを取得します。次に、円の中心を選択し、円の端から中心に向かって三角形を作成します。次に、円上の点を選択し、エッジからその点まで三角形を作成します。

サイズの形状と方向は、円と2つのポイントを生成するために使用する値によって異なります。すべてのステップはかなり単純であり、問​​題を引き起こすことはありません。

まず、スカラー値を細分化します。[0-2]-rangeから開始します。中点((start + end)/ 2)を取り、それで範囲を分割します。値をペアとして保存します。たとえば、1回細分割すると、次のようになります。[(0,1)、(1,2)]これを数回再帰的に実行してから、それらの点が円上にあるものを計算します。単純な三角法です。先に進む前に、値にπを掛けることを忘れないでください。この後、ある程度のエッジがあります。2 ^ nここで、nは細分割の量です。次に、頂点を1つ増やすことで、単純に三角形に変えることができます。したがって、三角形の量は2 ^(n + 1)になります。(量は、固定サイズの配列で実行しているかどうかを知るのに役立ちます。

編集:あなたが本当に欲しいのはパイです。(駄洒落でごめんなさい)

レンダリングも同様に簡単です。ここでも三角形だけを使用できます。スカラー範囲[-0.25-0.25]を選択し、細分割して円に投影し、1セットの三角形を生成するだけです。

スカラー円の射影は次のように単純です。x=cos(v * pi)r、y = sin(v pi)* rここで、(x、y)は結果の頂点、rは半径、三角関数は次のように機能します。度ではなく、放射輝度。(度で動作する場合は、円周率を180に置き換えます)

頂点バッファまたはリストを使用して、自分でレンダリングします。

編集:着色の質問について。glColor4f、ジオメトリの一部をその色で変えたい場合は、頂点バッファ自体の各頂点に色を割り当てることができます。私は今それを行うためのすべてのAPI呼び出しを知りませんが、openglのAPIリファレンスは非常に理解できます。

于 2008-10-26T12:40:32.397 に答える
2

パイを求める質問を再確認したので、opengl プリミティブを使用してそれを描画する簡単な方法もあります。

gluSolidSphere() を使用してソリッド球を描画します。ただし、その一部だけを描画したいので、不要な部分を切り取るだけです。

void glClipPlane(GLenum plane, const GLdouble * equation);

平面が GL_CLIPPLANE0 から GL_CLIPPLANEn であり、方程式が通常の形式の平面方程式である場合 (a x + b y + c*z + d = 0 は、方程式が値を保持することを意味します{ a, b, c, d }。これらは double であり、float ではないことに注意してください。

于 2008-10-27T12:43:29.893 に答える
2

Edit3について:あなたの質問を理解する方法は、OpenGLに境界線を描画させたいということであり、それらの間はすべて色で塗りつぶす必要があります。

あなたの考えは正しかったのですが、ライン ストリップは単なるラインのストリップであり、領域はありません。

ただし、ラインを相互に接続してポリゴンを定義することはできます。これにより、頂点ごとにポリゴンの領域が埋められます。コードの適応:

glBegin(GL_POLYGON);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

ただし、この方法で多角形を描画するには 2 つの制限があることに注意してください。

  • 多角形は凸状でなければなりません。
  • これは遅い操作です。

しかし、あなたはただ仕事を終わらせたいだけだと思います。これで十分です。将来的には、ポリゴンを三角測量することを検討してください。

于 2008-10-29T14:10:23.850 に答える
2

色の編集について:

OpenGL は実際にはステート マシンです。これは、描画時に現在のマテリアルおよび/または色の位置が使用されることを意味します。おそらくマテリアルを使用することはないので、今は無視してください。色が欲しい。

glColor3f(float r, float g, float b) // draw with r/g/b color and alpha of 1
glColor4f(float r, float g, float b, float alpha)

これは、glColorXX 呼び出しが実行された後、描画するすべての頂点の色、レンダリングするすべてのジオメトリの色 (glu のものであろうと独自のものであろうと) に影響します。頂点を持つ面を描画し、glVertex3f/glVertex2f 呼び出しの間で色を変更すると、色が補間されます。

これを試して:

glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-3.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 3.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(3.0, 0.0, 0.0);
glEnd();

しかし、すでに glColor4f を指摘したので、頂点ごとに色を設定したいと思います。そして、表示リストを使用してレンダリングしたいとします。

頂点のリストを表示できるように、それらに色のリストを持たせることもできます。必要なことは、色のリストを有効にして、リストが存在する場所を opengl に伝えることだけです。もちろん、それらは頂点リストと同じ衣装を持っている必要があります (同じ順序)。

もしあなたが持っていたら

glEnableClientState(GL_VERTEX_ARRAY);   
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glDisableClientState(GL_VERTEX_ARRAY);

このように色を追加する必要があります。フロートである必要はありません。実際、それがどのような形式であるべきかを伝えます。チャネルごとに 1 バイトで、4 つのチャネル (R、G、B、および A) のカラー リストの場合は、次を使用します。

glEnableClientState(GL_VERTEX_ARRAY);   
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors_);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

編集: glDrawElementsを呼び出して描画する要素を OpenGL に指示する必要があることを追加するのを忘れました。

于 2008-10-28T15:53:35.047 に答える