課題
飛行機のように見える3次元物体を設計して,
それを描画するプログラムを作成してください.
- 飛行機の形状は自由に決めてください.簡易なもので構いません.
- 飛行機の主なパーツの描画処理をメソッドにまとめるとよいでしょう.
- マテリアルは自由に決めてください.パーツごとにマテリアルを設定するとそれらしくなるでしょう.
- テクスチャの利用は必須ではありません.
- インタラクション,アニメーションの活用は必須ではありません.

もくじ
テンプレートファイル
次のテンプレートを利用してください. このテンプレートではカメラと光源を配置済みです. キーボードでカメラを動かす仕組みも定義してあります. あわせて物体のマテリアルを簡便に設定する仕組み,テクスチャマッピングを設定する仕組みも導入しています. 詳しくはテンプレートで確認してみてください.
このテンプレートプログラムでは,画像ファイルを指定して実行したとき,それをテクスチャ画像として利用するようになっています.
サンプルプログラム(ベジェ曲面)
OpenGLでのベジェ曲面を簡易的に扱う仕組みを導入した曲面の設定と描画処理方法を示したサンプルプログラムを示します. テクスチャマッピングも適用可能にしています. 詳しくはファイルを参照してください.
利用可能な図形
形状を設計するために利用可能な図形を紹介します. またサンプルプログラムを示します.
GLUTの図形
GLUTライブラリでは,以下のような図形が提供されています. これらを組み合わせたり,あるいは適宜スケーリングすることで, さらに複雑な図形を構築することもできます.
# トーラス
# 中心=原点,z軸に垂直
# inner トーラス内部の円の直径(太さを決める)
# outer 中心の空洞部の円の半径(大きさを決める)
# sides 放射方向の分割数
# stacks 放射方向と直交する方向の分割数
GLUT.SolidTorus(inner,outer,sides,stacks)
GLUT.WireTorus(inner,outer,sides,stacks)
# 球
# 中心=原点
# radius 半径
# slices 経線方向の分割数
# stacks 緯線方向の分割数
GLUT.SolidSphere(radius,slices,stacks)
GLUT.WireSphere(radius,slices,stacks)
# 円錐
# 中心軸=z軸,底面:z=0,頂点=(0,0,height)
# base 底面の半径
# height 高さ
# slices 経線方向の分割数
# stacks 緯線方向の分割数
GLUT.SolidCone(base,height,slices,stacks)
GLUT.WireCone(base,height,slices,stacks)
# 四面体
# 原点中心
GLUT.SolidTetrahedron()
GLUT.WireTetrahedron()
# 立方体
# 原点中心
# size: 大きさ
GLUT.SolidCube(size)
GLUT.WireCube(size)
# 八面体
# 原点中心
GLUT.SolidOctahedron()
GLUT.WireOctahedron()
# 十二面体
# 原点中心
GLUT.SolidDodecahedron()
GLUT.WireDodecahedron()
# 二十面体
# 原点中心
GLUT.SolidIcosahedron()
GLUT.WireIcosahedron()
GLUの図形
GLUライブラリは,二次曲面(quadric surface)として定義されている図形を提供します.
GLU図形を利用するには,予め二次曲面オブジェクトを用意する必要があります. また二次曲面の描画スタイルなどを指定しておく必要があります.
# 二次曲面オブジェクトの生成
quadric = GLU.NewQuadric()
# 二次曲面の描画スタイル
# quadric 二次曲面オブジェクト
# style 描画スタイル(GLU::POINT, GLU::LINE, GLU::FILL, GLU::SILHOUETTE)
GLU.QuadricDrawStyle(quadric,style)
# 二次曲面の法線処理モード
# quadric 二次曲面オブジェクト
# mode 法線モード(GLU::NONE, GLU::FLAT, GLU::SMOOTH)
GLU.QuadricNormals(quadric,mode)
二次曲面オブジェクトは一つ用意すれば,それをすべてのGLU図形の描画のために何度でも使うことができます. つまり二次曲面ごとに二次曲面オブジェクトを個別に用意する必要はありません. 利用できる図形を以下に示します.
# 球面
# quadric 二次曲面オブジェクト
# radius 半径
# slices 経線方向の分割数
# stacks 緯線方向の分割数
GLU.Sphere(quadric,radius,slices,stacks)
# 円柱面(中心軸=z軸,底面はz=0,上面はz=height)
# quadric 二次曲面オブジェクト
# base 底面側の半径
# top 上面側の半径
# height 高さ
# slices 経線方向の分割数
# stacks 緯線方向の分割数
GLU.Cylinder(quadric,base,top,height,slices,stacks)
# 円盤(孔あき;z軸に垂直)
# quadric 二次曲面オブジェクト
# inner 内側の半径(これが0なら孔はなくなる)
# outer 外側の半径
# slices 放射方向の分割数
# rings 円盤を構成する同心円の数
GLU.Disk(quadric,inner,outer,slices,rings)
# 扇型(孔あき;z軸に垂直)
# quadric 二次曲面オブジェクト
# inner 内側の半径(これが0なら孔はなくなる)
# outer 外側の半径
# slices 放射方向の分割数
# rings 円盤を構成する同心円の数
# start 開始位置(度)
# angle 中心角(度)
GLU.PartialDisk(quadric,inner,outer,slices,rings,start,angle)