auxライブラリには、ウインドウの初期設定(auxInitDisplayMo de等)や表示(auxInitWindow)などの機能の 他に、様々な3次元物体を一行で構成できるような便利な関数が用意されています。OpenGLでは3次元物体を構 成するときには、全ての頂点の座標と法線ベクトルの向きを指定しなければならないことを思い出してください。例 えば球19を作るためだけでも結構長いコードが必要です。従って、需要が高いと思われる多面体の構成コードがaux ライブラリに登録されています。その一つに球も用意されています。
球
auxWireSphere(GLdouble radius);
auxSolidSphere(GLdouble radius);
二つの関数は別々の機能を持ち、目的に応じてどちらかを利用します。上のWireの方は頂点どうしを線で結んだ表 示(ワイヤフレーム)を行ない、下のSolidの方は法線ベクトルの指定された面で描くため、照光処理を行なう立体 的な映像が欲しいときに用います。以下に挙げるその他の関数にもこのようにWire版とSolid版が存在します。
19もちろん球も多面体で近似します。
立方体
auxWireCube(GLdouble size);
auxSolidCube(GLdouble size);
直方体
auxWireBox(GLdouble width, GLdouble height, GLdouble depth);
auxSolidBox(GLdouble width, GLdouble height, GLdouble depth);
トーラス
auxWireTorus(GLdouble minorRadius, GLdouble majorRadius);
auxSolidTorus(GLdouble minorRadius, GLdouble majorRadius);
円柱
auxWireCylinder(GLdouble radius, GLdouble height);
auxSolidCylinder(GLdouble radius, GLdouble height);
円錐
auxWireCone(GLdouble radius);
auxSolidCone(GLdouble radius);
正四面体
auxWireTetrahedron(GLdouble radius);
auxSolidTetrahedron(GLdouble radius);
正八面体
auxWireOctahedron(GLdouble radius);
auxSolidOctahedron(GLdouble radius);
正十二面体
auxWireDodecahedron(GLdouble radius);
auxSolidDodecahedron(GLdouble radius);
正二十面体
auxWireIcosahedron(GLdouble radius);
auxSolidIcosahedron(GLdouble radius);
2.17glu libraryによる球、円筒、円盤の描画 33
ティーポット
auxWireTeapot(GLdouble size);
auxSolidTeapot(GLdouble size);
それぞれの関数の引数の意味は自明でしょう。すべての物体は原点を中心にして構成されます。もちろんこれらの関 数を使うときにはプログラムの最初に"aux.h"がincludeされている必要があります。
2.17 glu library
による球、円筒、円盤の描画
球、円筒、円盤を描く時、上記のauxライブラリを使えばとても手軽にこれらの物体を構成できます。一方その 反面、auxライブラリの関数では、その物体表面の\滑らかさ" (例えば球を構成するポリゴンの数)が調節出来ない ため、サイズを大きくして見た時に表面のポリゴンが見えてしまって気になる場合があります。そのような時には
gluライブラリを利用して下さい。gluライブラリにも球、円筒、円盤を描く関数が用意されていて、それらは物体 を構成するポリゴンの数を指定することが出来ます。
gluライブラリで球、円筒、円盤のどれかを描くときには必ず始めに
GLUquadricObj* gluNewQuadric(void);
という関数を呼びます。この関数名に含まれる\Quadric"という言葉は、glu libraryでは球、円筒、円盤を次の2 次式でモデルすることに由来します。
a
1 x
2
+a
2 y
2
+a
3 z
2
+a
4 xy+a
5 yz+a
6 zx+a
7 x+a
8 y+a
9 z+a
10
=0
gluでは物体のパラメータ(上の式のa1からa10
)や属性等をひとつの構造体にまとめます。gluNeqQuadricは その構造体を保存するのに必要なメモリ領域をアロケートし、そのアドレスを返します。その後で、例えば球を描く 場合は
glu による球
void gluSphere(GLUquadricObj *qobj, GLdouble radius,
GLinit slices, GLint stacks);
という関数を呼びます。第1引数にはgluNewQuadricでセットしたポインタを、第2引数には球の半径をいれます。
第3引数と第4引数が球を構成するポリゴンの細かさを指定する部分です。slicesは経度方向の分割数、stacksは緯 度方向の分割数です。同様に、
glu による円筒
void gluCylinder(GLUquadricObj *qobj, GLdouble baseRadius,
GLdouble topRadius, GLdouble height,
GLinit slices, GLint stacks);
glu による円盤
void gluDisk(GLUquadricObj *qobj, GLdouble innerRadius,
GLdouble outerRadius, GLinit slices, GLint stacks);
も用意されています。それぞれの引数の意味は推測できるでしょう。詳しくはOpenGL Programming Gluid, Sec-ondEdition [4],p.431を参照して下さい。また、実際にgluSphereを使ったサンプルプログラムが第3章(Xball.c;
p.72)に出て来ます。