Linux 上での超簡単な POV-Ray 入門

POV-Ray で オリジナル F1 マシンの CG を作ろう

目次:

POV-Ray の基礎知識

POV-Ray での CG の作成作業では,次の2つの手順を繰り返して行きます:

  1. モデリング: 人間がシーンファイル(CG の設計図のようなもの)をプログラミングします.
  2. レンダリング: POV-Ray がシーンファイルの指示にしたがって CG を描いてくれます.

シーンファイルを自由自在に編集するためには, 三次元座標 <x, y, z> を理解しておく必要があります. POV-Ray では,次の図のような座標系を使います.

これは,左手直交座標系という三次元座標です. x 軸,y 軸,z 軸のお互いの位置関係に注意してください. 左手の親指と人さし指と中指を互いに直角にして, 左腕を前に突き出してみると:

に対応します.

部品の位置を調整するときなどに, これら x, y, z の値を指定することになります.

組み立て

とにかく始めてみよう

次の2つのファイルを使って作業を開始します: (入手していない人はダウンロードしてください.)

まず,シーンファイル myF1.povレンダリングしてみよう: (部品ファイル F1.inc の方は気にしない.)

$  povray  +P  myF1.pov

未完成なので,これから部品を追加して行きます.

シーンファイルを解読してみよう

エディタを使って, シーンファイル myF1.pov の内容を見てみよう:

$  gedit  +P  myF1.pov  &

いろいろな呪文が書かれていますが,とりあえず今, 注目してほしいのは,次の部分です:

...
// F1 マシンの組み立て
#declare MyF1 = merge {
	// マシン本体
	merge {
		object { RoundBody }
		object { FrontLeg1(0) }
		object { RearLeg1 }
	}

	// ドライバー
	merge {
		object { Driver }
		object { Helmet2 }
	}
}
...

シーンファイルは,次のような命令文から構成されています:

部品を追加しよう

シーンファイルに命令を書き加えて,部品を追加してみましょう.

たとえば,次のように書き加えてみよう:

...
// F1 マシンの組み立て
#declare MyF1 = merge {
	// マシン本体
	merge {
		object { RoundBody }
		object { FrontLeg1(0) }
		object { RearLeg1 }
		object { RoundNose1 }
		object { RoundSide2 }
		object { FrontWing2 }
		object { RearWing1 }
	}

	// ドライバー
	merge {
		object { Driver }
		object { Helmet2 }
		object { Shield }
	}
}
...

シーンファイルの書き変えが終わったら, ファイルを保存し直そう. それから,もう一度,レンダリングし直してみよう.

何か不格好ですが...

これで一応,F1 らしくはなりました.

部品の種類は他にもあります. パーツの一覧の中から自由に選びましょう. パーツの組み合わせ例も参考にしてください.

取り付け位置を調整しよう

取り付け位置を変えてバランスよくしてみましょう.

たとえば,ホイールベース(前後のタイヤの間隔)がせまいので, 前タイヤ(FrontLeg)を 前に 30 cm , 後タイヤ(RearLeg)を 後に 20 cm , ずらしてみよう. シーンファイルを次のように書き変えればよい:

	...
	// マシン本体 
	merge {
		...
		object { FrontLeg1(0) translate -0.3*z }
		object { RearLeg1 translate 0.2*z }
		...
	}
	...

新しい命令が出てきました. 次の2通りの書き方があります:

たとえば,translate 1*x と translate <1, 0, 0> とは, 同じことになります. どちらでも,都合のよい方法で書けばよい.

なぜ,z 方向に移動しているのか?わからなければ, さっき 基礎知識 で説明された 三次元座標の図を見直しましょう.

それと,数値の単位については,メートルと思っていてください. 30 センチの場合,0.3 です. (組み立て中の F1 マシンの全長は 4.5 m 位,全幅は 2.0 m 位です.)

では,再びレンダリング...

おっと,今度は,前タイヤがフロントウィングとぶつかりそうです. それじゃ,前タイヤを少し後へもどしたり, フロントウィングの位置も変えてみようか... ちょっと,部品の種類が気に入らないな... ...こんな感じで,部品の種類や位置を自由にカスタマイズして行こう.

ところで,ドライバーの着座位置(座高)を変えたい場合, ドライバー本体(Driver)だけでなく, ヘルメット等(Helmet2 と Shield)も同時に移動しなければなりませんが, 各 object に対して,いちいち translate を書き加えるのは面倒ですね?

実は,merge したもの全体に対して,一度に translate してもよい:

	...
	// ドライバー
	merge {
		object { Driver }
		object { Helmet2 }
		object { Shield }
		translate 0.15*y		// 座高を 15 cm アップ
	}
	...

塗装と背景設定

美しく塗装しよう

レーシングカーらしく,キレイに着色してみましょう.

たとえば,ボディーを赤にするには:

...
object { RoundBody pigment { color Red } }
...

色の名前については, カラーの一覧の中から自由に選べます. それに,もちろん,他の部品やドライバーの服・ヘルメットの色も変えられます.

また,object 毎だけでなく,merge したもの全体について, 一度に着色することもできます. たとえば,マシン本体を全体的に青にするには:

	...
	// マシン本体
	merge {
		object { ... }
		object { ... }
		...
		pigment { color Blue }
	}
	...

これで,merge { ~ } 内のすべての object の色が変わります. ただし,個別に着色済みの object については変化しません.

しかし,この配色はヒドい...

部品への着色と全体への着色をうまく使い分け, 能率良くかつセンス良く作業しよう.

背景を追加しよう

作成したオリジナル F1 マシンをサーキットに持ち込みましょう.

地面と空を追加しよう. ついでに,座標軸も消してしまおう: (シーンファイルの変更場所が移ります.)

...
// F1 マシンの配置
object {
	...
}

// 舞台
object { Ground }		// 地面
sky_sphere { Fine }		// 空

// 座標軸(完成時に削除)
/*
object { Cylinder_X ... }	// x軸
object { Cylinder_Y ... }	// y軸
object { Cylinder_Z ... }	// z軸
*/
...

地面が見えました. 空については.カメラアングルを変えないと見えません. この後,確認します.

撮影

カメラワークを練習しよう

カメラアングルを変えてみましょう.

シーンファイルの中の camera { 〜 } の部分に注目しよう:

...
// カメラ
camera {
...
	rotate 0*x			// 上下の首振の角度(下がプラス)
	translate -10*z			// コース中心からの距離
	rotate 30*x			// 上下の移動の角度(上がプラス)
	rotate 35*y			// 左右の移動の角度(左がプラス)
	angle 30			// 視野(ズームインが小)
}
...

基準のカメラアングル

3つの rotate の数値を 0 にリセットしてみよう:

	rotate 0*x			// 上下の首振の角度(下がプラス)
	translate -10*z			// コース中心からの距離
	rotate 0*x			// 上下の移動の角度(上がプラス)
	rotate 0*y			// 左右の移動の角度(左がプラス)

真正面ですね.

このとき,カメラは +z 方向を向いてます.

上下左右の移動

まず,「上下の移動の角度」を変えてみよう.

	rotate 30*x			// 上下の移動の角度(上がプラス)
	rotate 0*y			// 左右の移動の角度(左がプラス)

上 30 度から見下ろしてます.

さらに,「左右の移動の角度」も変えてみよう.

	rotate 30*x			// 上下の移動の角度(上がプラス)
	rotate -45*y			// 左右の移動の角度(左がプラス)

高さはそのままで,右 45 度へ回り込みました.

なお,このカメラの場合,常に, 原点 <0, 0, 0> を真正面に捉えるように, 球面上を上下左右に移動します.

前後移動

今度は,「距離」を変更しよう:(-10 → -30)

	...
	translate -30*z			// コース中心からの距離
	...

遠くから見ています.

その他,「首振」と「視野」については, 必要に応じて,各自で確かめて見よう.

シーンを構成しよう

複数の物体をバランス良く配置し, ドラマチックなシーンを作りましょう.

F1 マシンの位置と方向を変えるには:

...
// F1 マシンの配置
object {
	MyF1
	rotate 60*y		// 方向の角度
	translate <-6, 0, 3>	// 位置
}
...

コースアウト...

さらに,他のマシン(味方チームや敵チーム)も登場させるには:

// F1 マシンの組み立て
#declare MyF1 = merge { ... }

// 敵チームAの F1 マシンの組み立て
#declare EnemyA = merge { ... }
...

// F1 マシンの配置
object { MyF1 ... }

// 味方チームのマシンの配置
object { MyF1 ... }

// 敵チームのマシンの配置
object { EnemyA ... }
...

やだ,味方が巻き込まれてる...

構図を決めよう

カメラアングルをうまく設定しよう.

敵チームは続々と華麗にパス...

なお,立体視画像を作る場合, たくさんの物体をさまざまな距離に散りばめておくと, より立体感が増すようです. そこで,このレンダリング例では,空に気球を浮かべてみました.

...
Balloons(30)	// 気球を 30 個ランダムに配置
...

参考資料