基本的なモデリング

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

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


基礎知識

前回の復習と今回の準備を兼ねて,実行してみよう.


基本形状

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

ソースコード断片と説明 レンダリング結果
// 球体
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 { 大半径, 小半径 }
	...
}
// 日本語を使う場合に必要な呪文
global_settings { charset utf8 }

// テキスト
object {
	text { ttf "ディレクトリ/フォントファイル.ttf"
		"テキスト" 奥行き, 文字間隔 }
	...
}
// 備考:「文字間隔」は通常「0」,or「数値*x」

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

#include "shapes.inc"
#include "colors.inc"

text の補足: テキストオブジェクト用の TrueType フォントファイルは, Linux の場合,ディレクトリ /usr/share/fonts/ のサブディレクトリ内にある. 次の要領でファイル名を調べ, 気に入る書体を試行錯誤で見つけよう:

$  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
	}
	...
}

Linux で日本語入力モードへ切り替えるには,[Ctrl]+[Space] キー. 文字列("~")とコメント(// ~)以外では, 日本語モードを OFF にすること.

特にありがちなミス: ソースコード部分で全角スペースを使うとエラーが発生する. 半角スペースと全角スペースは, 人間にとっては似たような物に思えるが, コンピュータにとっては全くの別物.

ただし,拡張子が「.ttf」のフォントファイルしか使えない. また,日本語には未対応・不完全対応なフォントもあるので注意しよう. --- 日本語には, /usr/share/fonts/ipa-gothic/ipag.ttf/usr/share/fonts/ipa-mincho/ipam.ttf が無難.


幾何変換

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

基本変換

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

--- ちなみに,translate と scale でも, パラメータを 軸*数値 の形式で指定可能.意味はわかるよね?

数値の部分には,計算式(四則演算や平方根や三角関数など)も指定できる.

使用例:

ソースコード断片と説明 レンダリング結果
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) には,次のようなものがある:

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. 物体の形状」 も参照しよう. 他にも,POV-Ray マニュアル には,多くの情報が掲載されている.


(c) 2016, yanagawa@kushiro-ct.ac.jp