前回の F1 モデルでは,既製のパーツを利用しただけなので, 簡単に CG 作品を完成できた. 一方,今後のオリジナル作品の制作では, パーツ自体から各自で作成する必要がある.
とは言え,何も無いところからでは,何も作ることはできないので, POV-Ray に元から組み込まれている基本形状を 原材料として利用することになる. 単純な形状をうまく組み合わせて, 任意の形状を自由自在に作り出して行こう.
前回の復習と今回の準備を兼ねて,次の通りに実行・確認してみよう:
$ gedit sample.pov &
とりあえず今は,次のような記述があることを確認するだけでよい: (後で,この部分を書き換えて行く.)
// モデル
object {
Sphere // 球体
pigment { color White }
}
$ povray +P sample.pov # 描画して一時停止 # または $ povray sample.pov # 描画して即時終了
$ eog sample.png &

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 { 大半径, 小半径 }
...
}
|
![]() |
// 上級者向け:これは後々に各自の必要に応じて試せばOK
// 日本語テキストを使う場合に必要な呪文
global_settings { charset utf8 }
// テキスト
object {
text { ttf "ディレクトリ/フォントファイル.ttf"
"テキスト" 奥行き, 文字間隔 }
...
}
// 備考:「文字間隔」は通常「0」,or「数値*x」
|
![]() |
なお,基本形状と色を利用するには, シーンファイルの先頭の方に, 次の記述も必要:
#include "shapes.inc" #include "colors.inc"
テキストオブジェクト用の 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
}
...
}
ただし,拡張子が「.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 してもよい. (要するに,新規に作成した形状も,元からあった基本形状も, 区別なくパーツとして利用できる.)
| ソースコード断片と説明 | レンダリング結果 (失敗例) |
|---|---|
// 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. 物体の形状」 も参照しよう. このマニュアルには,他にも,多くの有用な情報が掲載されている.
今回の作業の 進捗状況 と感想を報告せよ. 練習問題も完了した場合,作品も提出せよ.