基本的なモデリング

前回の F1 モデルでは,既製のパーツを利用しただけなので, 簡単に CG 作品を完成できた. 一方,今後のオリジナル作品の制作では, パーツ自体から各自で作成する必要がある.

とは言え,何も無いところからでは,何も作ることはできないので, POV-Ray に元から組み込まれている基本形状を 原材料として利用することになる. 単純な形状をうまく組み合わせて, 任意の形状を自由自在に作り出して行こう.


基礎知識

前回の復習と今回の準備を兼ねて,次の通りに実行・確認してみよう:

基本形状

POV-Ray には,どんな基本形状があるのか? 代表的なものを紹介しておく. サンプルシーンファイルの該当部分を 次の通りに書き換えてレンダリングしてみよう:

図形によっては, ソースコードを別な書き方でも表わせます. 教科書 chapter 2 も参考にしよう.
ソースコード断片と説明 レンダリング結果
// 球体
object { Sphere ... }

// 標準の寸法:半径 1
// 立方体
object { Cube ... }

// 標準の寸法:辺長 2(半辺 1)
// 円柱
object { Disk_X ... }

// 標準の寸法:底面半径 1,全長 2
// 備考:Disk_Y,Disk_Z もある.
// 円錐
object { Cone_Y ... }

// 標準の寸法:底面半径 1,全長 2
// 備考:Cone_X,Cone_Z もある.
// 無限円柱
object { Cylinder_Z ... }

// 標準の寸法:半径 1
// 備考:Cylinder_X,Cylinder_Y もある.
// 無限平面
object { Plane_XZ ... }

// 備考:Plane_XY,Plane_YZ もある.
// トーラス
object {
	torus { 大半径, 小半径 }
	...
}
// 上級者向け:これは後々に各自の必要に応じて試せばOK

// 日本語テキストを使う場合に必要な呪文
global_settings { charset utf8 }

// テキスト
object {
	text { ttf "ディレクトリ/フォントファイル.ttf"
		"テキスト" 奥行き, 文字間隔 }
	...
}
// 備考:「文字間隔」は通常「0」,or「数値*x」
文字列("~")とコメント(// ~)以外では, 日本語入力モードを OFFにすること.
特にありがちなミス: ソースコード部分で全角スペースを使うとエラーが発生する. 半角スペースと全角スペースは, 人間にとっては似たような物に思えるが, コンピュータにとっては全くの別物.

なお,基本形状と色を利用するには, シーンファイルの先頭の方に, 次の記述も必要:

#include "shapes.inc"
#include "colors.inc"
text の補足(上級者向け)

テキストオブジェクト用の TrueType フォントファイルは, Linux の場合,ディレクトリ /usr/share/fonts/ のサブディレクトリ内にある.

他の OS(Windows や MacOS)では, フォントファイルの在り処は異なる.

次の要領でファイル名を調べ, 気に入る書体を試行錯誤で見つけよう:

$ ls /usr/share/fonts/
...
ipa-gothic/
ipa-mincho/
...

$ ls /usr/share/fonts/ipa-gothic/
ipag.ttf
object {
	text {
		ttf "/usr/share/fonts/ipa-gothic/ipag.ttf"
		"こんにちは" 0.2, 0
	}
	...
}

ただし,拡張子が「.ttf」のフォントファイルしか使えない. また,日本語には未対応・不完全対応なフォントもあるので注意しよう.

日本語には, /usr/share/fonts/ipa-gothic/ipag.ttf/usr/share/fonts/ipa-mincho/ipam.ttf が無難. 日本語未対応フォントでは □ に文字化け.
幾何変換

形状の配置や寸法を変えてみよう.

幾何変換 のことを 座標変換 とも云います. 教科書 chapter 5も参考にしよう.
基本変換

各物体の大きさ・位置・姿勢を変更するには, object { ... } 等の括弧内に次のような記述を追加すればよい:

ちなみに,translate と scale でも, パラメータを 軸*数値 の形式で指定可能.意味はわかるよね?
数値の部分には,計算式(四則演算 +.-.*./ や平方根 sqrt() や三角関数 sin(),cos() など)も指定できる. (上級者向け)

使用例:

ソースコード断片と説明 レンダリング結果
object {				
	Cube
	translate <1.0, 0.0, 0.5>
	...
}
object {				
	Cube
	scale <2.0, 0.5, 1.0>
	...
}
object {				
	Cube
	rotate 45*y
	...
}
合成変換

あらゆる object { .... } には, 複数の幾何変換を適用できる. このとき,変換順序について注意が必要だ. 一般に,変換の順序が異なると,結果も異なる.

たまに,逆の順序でも同じ結果になるような組み合わせもあるが, それはあくまでも特殊な場合の偶然にすぎない.

まず,スケーリングと平行移動の組み合せについて, 変換順序による結果の違いを確認しよう:

ソースコード断片と説明 レンダリング結果
// スケーリング→平行移動
object {				
	Cube
	scale 0.5
	translate -2*x
	...
}
// 平行移動→スケーリング
object {				
	Cube
	translate -2*x
	scale 0.5
	...
}

// これだと移動量もスケーリングで変化

次に,回転と平行移動の組み合せを例として, 変換順序による結果の違いを確認してみよう:

ソースコード断片と説明 レンダリング結果
// 回転→平行移動
object {				
	Cube
	rotate 45*y
	translate -2*x
	...
}
// 平行移動→回転
object {				
	Cube
	translate -2*x
	rotate 45*y
	...
}

// これだと移動方向も回転で変化

なお,すべての幾何変換は,原点 <0, 0, 0> を基準として作用する.

CSG

複数の物体を組み合わせて,新しい物体を作成できる. 物体の組み合わせ演算 (CSG constructive solid geometry) には,次のようなものがある:

教科書 chapter 7 も参考にしよう. merge と union の結果は,不透明な物体では全く同じになる. ただし,透明な物体では,少し異なる. とりあえず現段階では,merge がオススメ.

使用例:

ソースコード断片と説明 レンダリング結果 構造説明図
// カプセル
merge {
	object { Sphere translate -1*x }		
	object { Disk_X }
	object { Sphere translate  1*x }
	pigment { color White }
}

// 球 + 円柱 + 球
// ボトル
merge {
	object { Disk_Y translate -1*y }
	object { Sphere }
	object { Disk_Y scale 0.4 translate 1*y }	
	pigment { color White }
}

// 小円柱 + 球 + 大円柱
// リング
difference {
	object { Disk_Z scale <2.0, 2.0, 0.2> }
	object { Disk_Z }
	pigment { color White }
}

// 大円柱 ー 小円柱
// ブックエンド
difference {
	object { Cube }
	object { Cube scale 2*x translate <0.0, 0.3, 0.3> }
	pigment { color White }
}

// 立方体 ー 直方体

// まぁ,merge でも出来ますが...
// ... 直方体 + 直方体,とか
// プリン
intersection {
	object { Cone_Y scale 2.0*y translate 1.0*y }
	object { Disk_Y scale <2.0, 0.5, 2.0> }
	pigment { color White }
}

// 円錐と円柱の共通部分

// あと,difference でも出来るよね...
// ... 円錐 ー 直方体,等
// 消しゴム
intersection {
	object { Cube scale <1.0, 0.5, 2.0> }
	object { Sphere scale 1.5 translate 1.0*z }
	translate -0.5*z
	pigment { color White }
}

// 直方体と球の共通部分

なお,CSG と幾何変換については,再帰的に適用できる. つまり,CSG した物体を,object と同様に幾何変換できるし, また,変換後の物体を集めて,さらに CSG してもよい. (要するに,新規に作成した形状も,元からあった基本形状も, 区別なくパーツとして利用できる.)

ありがちな失敗例 CSG では,物体同士の重複部分ができないように, または,重複部分が面一(つらいち)にならないように, あらかじめ形状を調整しておくべきだ. これをサボると,意図しない結果になってしまうことがある.

とりあえず今回は,トリビアとして頭の片隅に置いておくだけでよい. 余裕がある場合は実際に試してみよう.
ソースコード断片と説明 レンダリング結果
(失敗例)
// merge の失敗例
merge {
	object { Cube                 pigment { color White } }
	object { Disk_Z translate 1*x pigment { color Red } }
}

// 重複部分にノイズが発生.
// 解決するには,Disk_Z を半円柱に分け重複部分を無くしてから merge するとよい.
// 半円柱を作るには,下の intersection を参照.
// difference の失敗例
difference {
	object { Cube                 pigment { color White } }
	object { Disk_Z translate 1*x pigment { color Red } }
}

// 重複部分に薄皮とノイズが発生.
// 薄皮を取るには,Disk_Z の方を z 方向に拡大するとよい.
// ノイズだけを取るには,Disk_Z の方を z 方向に少しだけ縮小し,皮を厚くするとよい.
// intersection の失敗例
intersection {
	object { Cube                 pigment { color Red } }
	object { Disk_Z translate 1*x pigment { color White } }
}

// 重複部分にノイズが発生.
// 解決するには,Cube の方を z 方向に拡大するとよい.
// または,物体を半分に分けるには,Plane_* を使う方法もある.
練習問題

ここまでの作業の大方を消化できたら, 幾何変換と CSG の練習として, 適度に複雑な形状の物体を独自に作成してみよう.

題材については,自由に決めてよい. また,正確さにコダワりすぎると挫折しやすいので, 作りやすいように適当にデフォルメするとよい.

題材例: 食器,家電,IT機器,乗物,建物,etc.


作品例:マグカップ mug.pov(シーンファイル断片)

上級者向け情報: ディレクトリ /usr/share/povray-3.7/include/ にあるインクルードファイル shapes_old.inc 等の内容を調べてみよう. 上に紹介した以外にも,様々な基本形状が定義されている. また,POV-Ray マニュアル「11. 物体の形状」 も参照しよう. このマニュアルには,他にも,多くの有用な情報が掲載されている.

本日の課題

今回の作業の 進捗状況 と感想を報告せよ. 練習問題も完了した場合,作品も提出せよ.

担当教員へレポートを送信