povray 演習 2回目 1
2
コンピュータグラフィックス処理の構成 モデリング レンダリング modeling rendering 環境 空間 視点 空間配置 投影 クリッピング 光 光源(直射 間接) 被写体 形状 材質 時系列変化 動き 変形 画像 光線計算 照射 反射 屈折 散乱 など
モデルの対象 実世界での光学系の再現に必要なものすべて たとえば... 環境 ( 形状 だけではありません) 被写体 空間 視点 視野 視覚系(眼 カメラ) 形状 構造 色 材質(光線反射特性) 形状規則 生成法則 拡大縮小 変形 光 光源 光線 経路(反射 屈折 散乱) 時系列変化 動き 変化 など...
5
座標系 奥行方向にZ Y Y X X 視点からスクリーン(XY)を 見る 中央が原点 6
camera{ 視点の位置 --- どこから見ているか 視線の方向 --- どの点の方向を見ているか (0,0,0)ならば原点方向 画角...など light_source{ 光源 平行光線の場合 光源の方向(x,y,z) 光源(光線)の色 その他いろいろ... --- 物体を定義 たとえばSphere --- 球を定義する 指定しなければ直径は1.0 半径は0.5(?) スクリプトの最初に#include <shapes.inc>を入れれば 基本立体名が使える translate< x,y,z >, scale, rotate など 基本変換を入れられる 色 質感なども定義可能 あとは背景...かな 7
復習 右下のシーンを描いてみてください #include "shapes.inc" #include "colors.inc" #include "skies.inc" camera{ light_source { object { object { object { object { object { 最後の行に background{ color Gray を追加すると見やすくなります 先頭に#include "skies.inc", 最後にsky_sphere{ S_Cloud5 とすると 背景が空に なります 余裕があったら それぞれの形や色 大きさ 配置などを変更してみてください location <0,0,-20> look_at <0,0,0> angle 30 <10,10,-20> color White Sphere pigment{ color Blue finish{ specular 0.3 scale 1 Sphere pigment{ color Red finish{ specular 0.3 scale 0.7 translate <-2,0,0> Sphere pigment{ color Yellow finish{ specular 0.3 scale 0.7 translate <0, -2,0> Sphere pigment{ color Magenta finish{ specular 0.3 scale 0.7 translate <2,0,0> Sphere pigment{ color Green finish{ specular 0.3 scale 0.7 translate <0,2,0> sky_sphere{ S_Cloud5 8
困った時のマニュアル オンライン解説書 POV-Rayのメニュー Help -> Help on POV-Ray ネットでは以下のwebがよさそうです 横浜国立大学西村研究室 POV-Ray 3.5 クイックリファレンス 基本編 大分大学真鍋研究室 POV-Ray 3.5 利用参考マニュアル (右手系の解説) その他 いろいろ google検索してみてください 9
元気のある方 やってみてください declareと#whileを使えば楽です #declare ROT=0; #while (ROT<360) object { Cone_X pigment{ color Yellow finish{ specular 0.3 translate <-1.5,0,0> scale ROT/360 rotate < 0, 0, ROT > #declare ROT=ROT+60; #end とすれば 以下になります scaleの行がなければ円錐は同じ大きさになります 10
スケーリング (講義でこんなことをやりました) 拡大 縮小 : scale <sx,sy,sz> オブジェクト上の任意の点p(x,y,z) を 原点を中心として X,Y,Zそれぞれの方向にsx,sy,sz倍する処理 変換後の点p'(x',y',z') = p(sx x, sy y, sz z) つまり sx,sy,szの値が同じであれば そのまま拡大 縮小 異なれば変形する 11
講義でこんなことを説明しました スケーリング (拡大 縮小)(2D, 3D) 図形(2D) 物体(3D)を構成するすべての点に対して同じ処理を行う p (x,y ) p(x,y) x =Sx x y =Sy y p (x,y,z ) p(x,y,z) x =Sx x y =Sy y z =Sz z Sx,Sy,Sz : X,Y,Zそれぞれの軸方向へのスケーリング率 >1の時拡大 <1の時縮小
講義でこんなことを説明しました 図形 物体の平行移動 translate <x,y,z> 図形(2D) 物体(3D)を構成するすべての点に対して同じ処理を行う
講義でこんなことを説明しました 回転移動(2D) 原点を中心として 反時計方向に角度θ回転移動 p (x,y ) p(x,y) x = x cos θ - y sin θ y = x sin θ + y cos θ
講義でこんなことを説明しました 回転移動(3D) Z軸を中心とした回転 Z軸原点を中心として 反時計方向に角度θ回転移動 p (x,y,z ) p(x,y,z) x = x cos θ - y sin θ y = x sin θ + y cos θ z = z
講義でこんなことを説明しました 回転移動(3D) 同様にして X軸を中心に回転 Y軸を中心に回転 回転の正負 それぞれの軸の正方向から見て 反時計まわりが
講義でこんなことを説明しました これらを行列で表現 平行移動(2D) スケーリング(2D)
講義でこんなことを説明しました これらを行列で表現 回転移動(2D)
講義でこんなことを説明しました 複合変換 行列で表現する理由 複合変換の記述が容易 と いうふうに 複数の変換を一つの行列にまとめることができる 同様の変換をオブジェクトを構成する多くの点に対して行うので 非常に効率的
講義でこんなことを説明しました 3D変換を行列で表現 平行移動(3D) スケーリング(3D)
講義でこんなことを説明しました 回転(3D) 任意軸まわりの回転や 平行移動 回転 スケー リングを複合した変換は これらの変換組み合わ せ 変換行列を決定して から処理をおこなう それぞれ与える順が変 わると結果が異なるの で 交換則は成り立たな い
そろそろpovrayに戻ります #include "shapes.inc" #include "colors.inc" #include "skies.inc" 以下を描いてみてください camera{ light_source { object { object { object { object { object { object { sky_sphere{ S_Cloud5 location <0,5,-10> look_at <0,0,0> angle 60 <10,10,-20> color White * 2 Disk_Y pigment{ color Red scale <0.5, 2, 0.5> translate <0, 0, 3> finish{ specular 0.3 Disk_Y pigment{ color Yellow finish{ specular 0.3 scale <0.5, 2, 0.5> translate <0, 0, 3> rotate<0, 60, 0> Disk_Y pigment{ color Cyan scale <0.5, 2, 0.5> translate <0, 0, 3> rotate<0, 120, 0> finish{ specular 0.3 Disk_Y pigment{ color Magenta finish{ specular 0.3 scale <0.5, 2, 0.5> translate <0, 0, 3> rotate<0, 180, 0> Disk_Y pigment{ color Green finish{ specular 0.3 scale <0.5, 2, 0.5> translate <0, 0, 3> rotate<0, 240, 0> Disk_Y pigment{ color Blue scale <0.5, 2, 0.5> translate <0, 0, 3> rotate<0, 300, 0> finish{ specular 0.3 22
たくさんになると大変なので パラメータを使います 何を何回くりかえすか 繰り返し中にどんなことをするか 変数の定義 #declare K=0; ------ 変数Kを定義します 最初に0を代入しておきます #while (K<5) ------ 変数Kの値が5より小さい時に 以下を実行します この部分に処理を書きます 変数Kの値を使って何かをやれば便利です このサンプルファイルでは object Sphereを定義し pigment Yellow にして translate <K,1,0> ---- K,1,0に移動 #declare K=K+1; ---- 変数Kに1を加えます #end ----- 上の#whileからこの#endまでを繰り返します 23
#include "colors.inc" #include "shapes.inc" camera{ location <5,10,-15> look_at <0,0,0> angle 35 #declare K=0; ------ 変数Kを定義します 最初に0を代入しておきます #while (K<5) ------ 変数Kの値が5より小さい時に 以下を実行します この部分に処理を書きます 変数Kの値を使って何かをやれば便利です このサンプルファイルでは object Sphereを定義し pigment Yellow にして translate <K,1,0> ---- K,1,0に移動 #declare K=K+1; ---- 変数Kに1を加えます #end ----- 上の#whileからこの#endまでを繰り返します light_source{ <-15, 20, -20> color White * 1.5 Plane_XZ pigment{ checker color Gray color White translate <0,0.5, 0> #declare K=0; #while (K<5) Sphere scale 0.5 pigment { color Yellow finish { specular 0.3 translate <K, 1, 0> #declare K=K+1; #end 24
ちょっと練習 さきほどのシーンファイルの内容を変更して 縦(上下)にボールを5個並べる 奥行方向にボールを5個並べる 円形に配置する ボールの数はいくつでも 円形に配置 色を順番に変えていく color rgb<,, > ---- 色を数字で与える関数 = Redの成分量(0 1) = Greenの成分量(0 1) = Blueの成分量(0 1) これを使えばKという変数をもとに RGBの値を決めることができます 縦横に配置する 25
#include "colors.inc" #include "shapes.inc" #include "stones.inc" #declare, #while #declare, #end のループを二重にすればOK です ループのパラメータの起点と終点 増分をうまく与えれば処理 が楽です camera{ location <5,10,-15> look_at <0,0,0> angle 40 どうせ作るならば綺麗な方がいいので 石の質感をつけてみました あとで説明しますが 簡単に言うと #include "stones.inc" を入れて から pigment {... の代わりに texture{ テクスチャ名とすれば OKです light_source{ <-15, 20, -20> color White * 1.5 povray texture, povray stones.inc などでぐぐってみると いろいろ な情報が見つかるかと思います Plane_XZ texture { checker texture{t_stone9,texture{t_stone8 // pigment { checker color White color Gray translate <0,0.5, 0> 左のスクリプトのうち 左端が // になっているところはコメント行とし て扱われますので 処理に関係ありません 対比のために残しました #declare L = -4; #while (L <= 4) #declare K = -4; #while (K <= 4) Sphere scale 0.5 texture{ T_Stone18 // pigment{ color Yellow finish { specular 0.3 translate <K, 1, L> #declare K=K+2; #end #declare L=L+2; #end 26
27
形状の演算 (CSG) CSG Constructive Solid Geometry 複数の集合=基本形状の 和 = union 差 = difference 積(共通部分) = intersection を使って 形状を定義する 28
union, difference, intersection 複数の集合(基本形状)の 和 = union 差 = difference 積(共通部分) = intersection を使って 形状を定義する #include "colors.inc" #include "shapes.inc" camera{ location <0,0,-10> look_at<0,0,0> angle 30 light_source{ <-10, 10, -10>, color White light_source{ < 10, 10, -10>, color White light_source{ < 0, 2, -10>, color White union{ Disk_Y pigment{ color Red finish{ specular 0.3 Cube rotate <45,30,0 > pigment{ color Gray finish{ specular 0.3 background{ color Gray 29
課題 一枚の画像の中に 以下の3つを並べて描いてみてください 左から順に union, difference, intersectionです translate<-3,0,0>, translate<3,0,0>を使って両側にずらせてください 画面に入りきらない場合 画角(angle)をちょっと広げるか 視点を遠く(Zの値を2倍程度に)す れば全体が入ります 30
#include "colors.inc" #include "shapes.inc" camera{ location <0,0,-20> look_at<0,0,0> angle 30 intersection{ Disk_Y pigment{ color Red finish{ specular 0.3 Cube rotate <45,30,0 > pigment{ color Gray finish{ specular 0.3 light_source{ <-10, 10, -10>, color White light_source{ < 10, 10, -10>, color White light_source{ < 0, 2, -10>, color White union{ Disk_Y pigment{ color Red finish{ specular 0.3 translate < 3,0,0> Cube rotate <45,30,0 > pigment{ color Gray finish{ specular 0.3 translate <-3,0,0> difference{ Disk_Y pigment{ color Red finish{ specular 0.3 Cube rotate <45,30,0 > pigment{ color Gray finish{ specular 0.3 31
32
カップを作ってみてください 解答例(できるだけ見ないで作ってください) #include "colors.inc" #include "shapes.inc" #include "textures.inc" camera{ location< 0, 5, -10 > look_at<0,0,0> angle 30 light_source{ < -10, 10, -10> color White difference{ Disk_Y pigment{ color White Disk_Y scale 0.9 translate< 0, 1.1, 0> pigment{ color White このあと 取手を付けます 前後方向の円柱(Disk_Z)を使った形状演算で作ります 33
#include "colors.inc" #include "shapes.inc" どんな構造をしているのか 何から何を引けばいいのか など 頭の中だけでなく 紙の上に描いて 数値を書き込 んでみるとわかります = 上の部分に蓋が残らないように 内側のオブジェクトをちょっと持ち上げてから抜きます = 右に移動 translate< 1,0,0> camera{ location <0,4, -10> look_at <0,0,0> angle 30 light_source{ <-10, 10, -20> color White*2 // --- カップの部分 ---difference{ Disk_Y Disk_Y scale <0.9, 1, 0.9> translate <0,0.2, 0> pigment{ color White // --- 取っ手の部分 ---difference{ Disk_Z scale <0.8, 0.8, 0.1> Disk_Z scale <0.7, 0.7, 0.2> translate< 1,0,0> pigment{ color White 34
#include "colors.inc" #include "shapes.inc" camera{ location <0,4, -10> look_at <0,0,0> angle 30 light_source{ <-10, 10, -20> color White*2 // --- カップの部分 ---difference{ Disk_Y Disk_Y scale <0.9, 1, 0.9> translate <0,0.2, 0> pigment{ color White // --- 取っ手の部分 ---difference{ Disk_Z scale <0.8, 0.8, 0.1> Disk_Z scale <0.7, 0.7, 0.2> translate< 1,0,0> pigment{ color White background{ color Gray 35
36
課題 円柱(Disk_YやDisk_Z)を使ってカップを作ってみてください できる人は取手を付けてみてください さらにできる人は中にコーヒーを入れてみてください 二つの円柱をdifferenceを使って組み合わせれば作れます 引く側(内側)の円柱は 外側より直径が小さく かつ 長さが長くないと穴をあけられません 続いてこのカップに模様や質感を与えます もし湯気を描けたり コーヒーがはねて飛び散るような 表現ができた人が居たら教えてください CGの研究にお誘いしたいです 37
ちょっとtips = = 上の部分に蓋が残らないように 内側のオブジェクトをちょっと持ち 上げてから抜きます 右に移動 =? 38
紅茶の方が好き という人へ... #include "colors.inc" #include "shapes.inc" camera{ location <0,4, -10> look_at <0,0,0> angle 30 light_source{ <-10, 10, -20> color White*2 // --- カップの部分 ---difference{ Disk_Y Disk_Y scale <0.9, 1, 0.9> translate <0,0.2, 0> pigment{ color White // --- 取っ手の部分 ---difference{ Disk_Z scale <0.8, 0.8, 0.1> Disk_Z scale <0.7, 0.7, 0.2> translate< 1,0,0> pigment{ color White // --- coffee -- Disk_Y scale <0.9, 0.7, 0.9> // --- 内側の円柱 ちょっと上下を小さく pigment{color Brown filter 1.0 //---茶色 interior{ ior 1.33 // --- 屈折率 1.33 background{ color Gray 39
40