前回は,F1 マシンの CG を作成してみたが, 出来合いの部品同士を組み合わせるだけだったので, あまりにも簡単すぎた. 実は,CG の作成では,部品の形状を新規に作成する方がより重要な作業となる.
今回は,任意の形状の創成方法について理解しよう.
まず,サンプルのシーンファイルを使ってレンダリングしてみる.
作業手順は前回と同様. まずは,レンダリングしてみよう:
$ povray +P sample.pov
表示された画像をクリックすると終了する.
生成された画像は,画像ファイル sample.png にも記録されている. 再表示してみよう:
$ display sample.png &
ちなみに,display は, 画像処理ソフトウェア集 ImageMagick のコマンドのひとつであり, さまざまな種類の画像の表示に利用できる. つまり,POV-Ray 専用というわけではない.
なお,PC によっては,display コマンドが使えない (インストールされていない)場合もある. eog コマンドや firefox コマンドでも代用できる.
次に,エディタでシーンファイル sample.pov を開き, ソースコードに目を通してみよう. そこに,object { Sphere } という記述がある. 以下,この記述を変更して行く.
三次元 CG の作成では,まず, 単純な形状の物体を組み合わせることによって複雑な形状の物体を表現する. このモデリングの作業について, シーンファイルの記述方法を説明する.
POV-Ray では次のような基本形状が用意されている:
なお,位置ベクトル(座標)や法線ベクトル(方向)について, 基本的には,<x, y, z> 形式で記述する. 詳しくは,教科書 ch.2「基本形状」を参照せよ.
上記の基本形状をシーンファイルに記述する際, 初心者の内は,パラメータの種類や順序を間違え易い. そこで, より簡単な方法をお勧めしておく:
練習のため,シーンファイル sample.pov の内容を書き換えて, Sphere 以外の形状をレンダリングしてみよう.
また,shapes.inc の円柱・円錐には, Disk_Y や Cone_Z 等もある. 平面についても同様に,Plane_XY の他, Plane_XZ と Plane_YZ もある. これらについても試そう.
なお,これらの簡便な基本形状についてはすべて, 中心位置が原点 <0, 0, 0> に設定されている. そして,POV-Ray の三次元座標系は,次の図のような左手系である:
シーンファイル中の記述 pigment { color ... } は,色の設定である. 色を変えたければ,カラーの一覧を参考にすること.
各物体の大きさ・位置・姿勢を変えることができる. object { ... } の中に次のような記述を追加すればよい.
詳しくは,教科書 ch.5「座標変換」および マニュアル 2「座標系と変形」を参照せよ.
使用例を示しておく:
ソースコード | レンダリング結果 |
---|---|
object { Cube scale <2.0, 1.0, 1.0> pigment { color White } } |
![]() |
object { Cube translate <0.0, 0.0, 1.0> pigment { color White } } |
![]() |
object { Cube rotate z*30 pigment { color White } } |
![]() |
object { .... } には,複数の変換を指定することもできるが, 記述の順序に注意する必要がある. 一般に,変換の順序が異なると,結果も異なる.
なお,それぞれの変換は,原点 <0, 0, 0> を基準としている.
複数の物体を組み合わせて,新しい物体を作成できる. 物体の組み合わせ演算 CSG(Constructive Solid Geometry)には, 次のようなものがある:
詳しくは,教科書 ch.7 「物体の演算」および マニュアル 11.3「CSG」を参照せよ.
使用例を示しておく. (なお,ソースコードの各行の // 以降はコメントである.)
ソースコード | レンダリング結果 |
---|---|
// 鉄アレイ merge { object { // 取っ手 Disk_X scale <1.0, 0.25, 0.25> } object { // 重り玉 Sphere translate <-2.0, 0.0, 0.0> } object { // 重り玉 Sphere translate < 2.0, 0.0, 0.0> } pigment { color Brown } } |
![]() |
// 灰皿 difference { object { // 本体 Disk_Y scale <2.0, 0.5, 2.0> } object { // 内側 Disk_Y scale <1.8, 0.5, 1.8> translate <0.0, 0.2, 0.0> } object { // 切込 Disk_X scale <3.0, 0.2, 0.2> translate <0.0, 0.5, 0.0> } object { // 切込 Disk_Z scale <0.2, 0.2, 3.0> translate <0.0, 0.5, 0.0> } pigment { color Gray } } |
![]() |
// 鉛筆 intersection { // 六角柱を作る object { Cube scale <2, 2, 1> } object { Cube scale <2, 3, 1> rotate y*60 } object { Cube scale <2, 3, 1> rotate y*120 } // 先端を削る object { Cone_Y scale <2, 2, 2> } pigment { color Orange } } |
![]() |
CSG 演算で作成した物体を複数個利用したい場合には, #declare によって物体を定義しておくと便利である.
#declare 物体名 = CSG演算 { ... }
使用例は次のとおり:
// 灰皿を定義 #declare AshTray = difference { object { Disk_Y scale <2.0, 0.5, 2.0> } object { Disk_Y scale <1.8, 0.5, 1.8> translate <0.0, 0.2, 0.0> } object { Disk_X scale <3.0, 0.2, 0.2> translate <0.0, 0.5, 0.0> } object { Disk_Z scale <0.2, 0.2, 3.0> translate <0.0, 0.5, 0.0> } } // 灰皿#1 を配置 object { AshTray translate <0, 1, 0> pigment { color White } } // 灰皿#2 を配置 object { AshTray translate <0, -1, 0> pigment { color Gray} }
CSG を一度だけしか書かずに,複数の物体を作成・配置できる. 物体の形状を修正する場合,定義部分の一箇所を変更するだけで, すべての物体の形状を変えられる. 非常に効率的だ.
なお,#declare されたものは,新たな基本形状となり, CSG の要素としても利用可能である. これによって, まず細かな部品を作り, それらを組み合わせて別の部品を作り, さらにそれらを組み合わせて...という 階層化設計によって, 効率的に作業を進めることができるようになる. 次のような感じ:
#declare Part1 = ... // 小部品#1 #declare Part2 = ... // 小部品#2 ... #declare Module1 = merge { // 中部品#1 object { Part1 ... } // 小部品#1 と... object { Part2 ... } // 小部品#2 とを組み合わせて... ... } ... #declare Component1 = merge { // 大部品#1 object { Module1 ... } // 中部品#1 と... object { Module2 ... } // 中部品#2 とを組み合わせて... ... } ... merge { // 全体像 object { Component1 ... } object { Component2 ... } ... }
本科目では,プログラミングの効率化を目標としているので, #declare および #macro を積極的に活用して行く.
CSG を駆使して,適度に複雑な形状の物体を定義せよ.
特別研究関連物品(装置,試料,etc.)や 身の回り品(コーヒーカップ,パソコン,自動車,etc.)を題材にするとよい.
特に,自動車には, タイヤ,タイヤハウス,ドアミラー等, #declare の恰好の練習対象がある. 挑戦して欲しい.
Tips: ドアミラーのような左右対称物体を作るには, scale の拡大率に負の値を指定すればよい.
担当教員へレポートを送信せよ:
限られた時間の中で できるだけ完成度を高めるために... おすすめな作業の進め方:
これだと,作品の全体像が常に (完成度の大小はあるものの)完成状態になっている. 一方,いきなり完璧な造形を目指してしまうと, 全体的な完成状態を一度も見ることなく,途中で挫折しやすい. 要するに,perfectではなく, complete を目指そう. そして,どれだけ改変を加えても, その日・その時での完成状態を常に維持しておこう.
シーンファイルの先頭付近に #include "textures.inc" を付けると, 様々なテクスチャ(質感)を与えることができる. このためには,pigment { color ... } の代わりに texture { ... } を記述する. どのようなテクスチャがあるかは, 教科書の ch.6 と資料5 や マニュアル 14 を調べてほしい.
また,物体の色を透明化したい場合, pigment { ... } に transmit 透過率 を追加する. ここで,透過率には 0.0 ~ 1.0 の数値を指定する.
背景として無地の他,空や宇宙の模様も利用できる.
詳しくは,教科書 ch.8 を調べよう.
また,地面としては,平面等だけでなく, ハイトフィールドを利用すれば, 起伏のある地形も表現できる.