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