課題
飛行機のように見える3次元物体を設計して,
それを描画するプログラムを作成して下さい.
- 飛行機の形状は自由に決めてください.簡易なもので構いません.
- 飛行機の主なパーツの描画処理をメソッドにまとめるとよいでしょう.
- 材質(マテリアル)は自由に決めてください.パーツごとにマテリアルを設定するとそれらしくなるでしょう.
- テクスチャを貼る必要はありません.
- インタラクション機能,アニメーション機能を導入する必要はありません(導入することは歓迎です).
もくじ
テンプレートファイル
次のテンプレートを利用して構いません. カメラと光源を適当に配置しています. またキーボードでカメラを動かす仕組みを入れてあります. マテリアルを簡便に設定するメソッドを定義しています. 詳しくはテンプレートで確認してみてください.
利用可能な図形オブジェクト
形状を設計するために利用可能な図形オブジェクトを紹介します.
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)として定義されている図形オブジェクトが用意されています. 次にサンプルプログラムを示します(GLUT図形オブジェクトのサンプルと同じです).
二次曲面を利用する際には,二次曲面オブジェクトが必要となります. また予め二次曲面の描画スタイルなどを指定しておく必要があります.
# 二次曲面オブジェクトの生成
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)
# 二次曲面のテクスチャ処理モード
# quadric 二次曲面オブジェクト
# mode テクスチャON/OFF (GL::TRUE, GL::FALSE)
GLU.QuadricTexture(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)