OpenGL (GLUT を使用) で円錐のような塗りつぶされたエンベロープを描画するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/237899

  •  04-07-2019
  •  | 
  •  

質問

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

円錐 (2D) のようなエンベロープを描画する必要があります。エンベロープを何らかの色で塗りつぶし、透明度を適用する必要があります。

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

編集1:2D 円錐のことを明確にするために...エンベロープは、(敵航空機の) 迎撃中の航空機のカバーエリアをグラフィカルに解釈したものです...円のセクターに似ています...代わりにセクターについて言及するべきでした...

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

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

編集3: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 でどのように可能なのかわかりません...しかし、閉じた曲線に対してそれを行うにはどうすればよいでしょうか?

役に立ちましたか?

解決

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つの制限があることに注意してください:

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

しかし、私はあなたが仕事を終わらせたいだけで、これがそれを行うと仮定します。将来的には、ポリゴンを三角形分割することを検討してください。

他のヒント

「エンベロープ」の意味がわかりませんが、コーンはグルトが持つプリミティブです:

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

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

パイを求める質問を明確にしたので、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ではないことに注意してください。

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

でも2Dの事は分かりません。2Dの円錐?ただの三角じゃないの?

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

まず円を作成し、適切な量のエッジが得られるように均等に分割します。次に、円の中心を選択し、端から円の中心まで三角形を作成します。次に、円上の点を選択し、端からその点まで三角形を作成します。

サイズの形状と方向は、円と 2 つの点の生成に使用する値によって異なります。すべての手順は非常に単純なので、問題を引き起こす必要はありません。

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

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

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

スカラー - 円投影は次のように単純です。x=cos(v*pi)r、y=sin(vpi)*r ここで、(x,y) は結果として得られる頂点、r は半径であり、三角関数は度ではなく放射輝度に作用します。(度を扱う場合は、pi を 180 に置き換えます)

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

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

色の編集:

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

EDIT: glDrawElements

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top