4. GLU

4.010   GLU とは何ですか?それは OpenGL とどのように違うのですか?

もしOpenGLを低レベルの3Dグラフィックスライブラリとみなしているならば、GLUを、OpenGLによって提供されなかったいくらかのより高レベル機能を追加するとみなしてください。 GLUの機能のうちのいくつかが含みます:

GLUについての情報の最もよいソースは、OpenGL赤およびOpenGLorg Webページ から得ることができる青い本とGLU指定です

4.020   GLU はどのようにして球、円柱、円板形状を描くのですか?

どのようにGLUがこれらのプリミティブを生成するかについて特別な何もありません。 GLUがすることをするルーチンを容易に書くことができます。 岩石台地ソースもダウンロードできてGLU配布を含み、これらのルーチンが何をしているかをわかります

GLUルーチンは、クワタストリップや三角形ファンなどの指定された原始的な使用正常なOpenGL原始人に近づきます。 表面はユーザーパラメータに従って近づかれます。 頂点は、sinf()とcosf()数学ライブラリ機能に呼び出しを使って生成されます。

もしシリンダと管をすることに興味があるならば、GLEライブラリを試験したいでしょう。 GLEはGLUT配布の一部として来ます。

4.030 gluPickMatrix はどのような働きをしますか?

それは単に翻訳し、測量します 従って 指定された選りすぐり領域塗りつぶしビューポート 。 正常な投射行列(などので、() gluPerspectiveです glFrustum()、glOrtho()、またはgluOrtho2D() )において増加することに先がけて投射行列スタックにおいて指定される時には、結果は、眺めボリュームが選りすぐり地域に強制されることです。 こちら 選りすぐり地域を横切っているプリミティブだけが眺めボリュームに陥る 。 glRenderMode()がGL_SELECTに設定される時には、これらのプリミティブは戻されます。

4.040  GLUテセレーションルーチンはどのように使えますか?

GLUは、あなたに、穴で、凹面のポリゴン、セルフ横切っているポリゴン、およびポリゴンをさせるために、モザイク細工ルーチンを提供します。 モザイク細工ルーチンは、これらの複雑なプリミティブ(ことによると、それで群がります)を、OpenGL APIによりできるより簡単で、凸面のプリミティブに解体します。 これは、アプリケーションが提供しなければならないコールバックルーチンからアプリケーションにより簡単なプリミティブのデータを提供することによってされます。 アプリは、その時、正常なAPI呼び出しを使ってデータをOpenGLに送ることができます。

例プログラムは、progs/redbook/tess.cの下のGLUT配布において入手可能です。 GLUT配布をダウンロードしてください)。

モザイク細工ルーチンを使うための通常のステップは下記です

1. 新しいGLUモザイク細工オブジェクトを割り当ててください:

GLUtesselator *tess = gluNewTess();

2. このモザイク細工オブジェクトによってコールバックを使用に割り当ててください:

gluTessCallback(tess、GLU_TESS_BEGIN、tcbBegin);
gluTessCallback(tess、GLU_TESS_VERTEX、tcbVertex);
gluTessCallback(tess、GLU_TESS_END、tcbEnd);

2a。 もしプリミティブがセルフ交差しているならば、新しい頂点を作成するために、コールバックも指定しなければなりません:

gluTessCallback(tess、GLU_TESS_COMBINE、tcbCombine);

3. 複雑な原始的なデータをGLUに送ってください:

//は想定します:
// GLdoubleデータ[numVerts][3];
// ...andは、配列が3D頂点データによって満たされたと想定します。

gluTessBeginPolygon(tess、NULL);
gluTessBeginContour(tess);
(i=0のために; (sizeof(GLdouble)*3); i++) gluTessVertex (tess、データ[i
]、データ[i]);
gluTessEndContour(tess);
gluEndPolygon(tess);

4. コールバックルーチンにおいて、適切なOpenGL電話をかけてください:

空のtcbBegin(堅苦しいGLenum);
{
   glBegin(堅苦し);
}

空のtcbVertex(空の*data)
{
   glVertex3dv((GLdouble*)データ);
}

空のtcbEnd ();
{
   glEnd ();
}

空のtcbCombine(GLdouble c[3]、空の*d[4]、GLfloat w[4]、空の**out){
   GLdouble *nv =(GLdouble*)malloc(sizeof(GLdouble)*3);

   nv[0] = c[0];
   nv[1] = c[1];
   nv[2] = c[2];
   *out = nv;
}

ステップとコードセグメントの上記のリストは、実用本位の例であり、モザイク細工ルーチンの完全な機能を示すことを意図しません。 パラメータとしてgluTessBeginPolygon()とgluTessVertex()にアプリケーション具体的なデータを提供し、適切なコールバックルーチンにおいてデータを処理することによって、アプリケーションは、それとしてのこれらのプリミティブがする 正常なOpenGLプリミティブ マップを着色できて、織ります。

4.050  なぜテセレーションコールバックルーチンが呼ばれないのでしょう?

普通、gluEndPolygon()を呼ぶ時には、モザイク細工コールバックルーチンが実行されます。 もし彼らが呼ばれていないならば、エラーは起こりました。 一般に、セルフ横切っているプリミティブのためのGLU_TESS_COMBINE*コールバックを定義しなかった時には、これは起こされます。

GLU_TESS_ERRORが、それが呼ばれるかどうかをわかるように、コールバックを定義してみてさしつかえありません

4.060  GLU NURBS ルーチンはどのように使えますか?

GLU NURBSインタフェースは、表面をするために、OpenGL評価者ルーチンにBスプライン基礎コントロールポイントをBezier基礎当量と呼び出しに直接変換します

例プログラムは、progs/redbook/surface.cの下のGLUT配布において入手可能です。 GLUT配布をダウンロードしてください)。

4.070  gluProject と gluUnProject はどのように使えますか?

両方のルーチンは、パラメータとしてModelView行列、投射行列、およびOpenGLビューポートを取ります

gluProject()はXYZ-オブジェクトスペース座標も取ります。 それは、変換されたXYZウィンドウ(または機器)同等当量を戻します。

gluUnProject()は反対物をします。 それはXYZウィンドウ座標を取り、後ろ変換されたXYZオブジェクト同等当量を戻します。

ウィンドウスペースZの概念はしばしば紛らわしい。 それは、0.0から1.0までの範囲のGLdoubleとして表現された深さバッファ価値です。 もし0.0のZ値と同等なウィンドウが、zNearを切り取っている飛行機に置かれた目座標と デフォルトglDepthRange() 一致しているならば。 同様に、1.0のウィンドウスペースZ価値が、zFar飛行機に置かれた目スペース座標と一致しています。 glReadPixels()によって深さバッファを読んでどのようなウィンドウスペースZ価値でも得ることができます。