前回の F1 モデルでは,既製のパーツを利用したので,簡単に CG 作品を完成できた. しかし,今後のオリジナル作品の制作では,パーツ自体から各自で作成する必要がある.
とは言え,何も無いところからでは,何も作ることはできないので, POV-Ray に元から組み込まれている基本形状を 原材料として利用することになる. 単純な形状をうまく組み合わせて, 任意の形状を作り出して行こう.
前回の復習と今回の準備を兼ねて,実行してみよう.
$ gedit sample.pov &
とりあえず今は,次のような記述があることを確認するだけでよい: (後で,この部分を書き換えて行く.)
// モデル object { Sphere // 球体 pigment { color White } }
$ povray sample.pov $ povray +P sample.pov
$ eog sample.png &
どんな基本形状があるのか? 代表的なものを紹介しておく. サンプルシーンファイルの該当部分を書き換えてレンダリングしてみよう.
ソースコード断片と説明 | レンダリング結果 |
---|---|
// 球体 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 { ... } の中に次のような記述を追加すればよい:
数値の部分には,計算式(四則演算や平方根や三角関数など)も指定できる.
使用例:
ソースコード断片と説明 | レンダリング結果 |
---|---|
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; Constructive Solid Geometry) には,次のようなものがある:
使用例:
ソースコード断片と説明 | レンダリング結果 |
---|---|
// カプセル 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.
上級者向け情報: ディレクトリ /usr/share/povray-3.7/include/ にあるインクルードファイル shapes_old.inc 等の内容を調べてみよう. 上に紹介した以外にも,様々な基本形状が定義されている. また,POV-Ray マニュアル「11. 物体の形状」 も参照しよう. 他にも,POV-Ray マニュアル には,多くの情報が掲載されている.