相機擺放基礎
內容摘要:
這是第二篇有關 RenderMan 的文章。 在本文裡, 我們將探討相機的設置與擺放方式,
我們也將學習一些用相機產生的特殊效果。 雖然 RenderMan 的相機擺放方式,
沒有 Pov-Ray 來得直觀, 但是在描述相機軌跡時有它的優點。
關於這一點, 我們在第三篇文章中, 還會再討論到。
簡介
在這第二篇文章中﹐ 我們將詳細探討 RenderMan 的相機模型。
相機是 RenderMan 中最重要的元素之一。
它可產生許多有趣的效果﹐ 像動態模糊 (Motion Blur)
(當我們拍攝運動物體時﹐ 其在相片上留下移動的軌跡)
和景深 (Depth of Field) (聚焦)。
雖然更多的效果可以加入相機模型中﹐ 像眩光 (Lens Flare)
( 由於光源直射鏡頭, 而在相片上產生灰霧或光斑的現象 )﹐
但是那會使模型太複雜。 許多這類的效果可由 shaders 產生
( shader 是一種把圖案加到物體表面的工具 )。
使用一系列的 shader, 我們可以做出自己的 "shaders"﹐ 產生令人驚嘆的效果。
在下一篇文章裡﹐ 我們將討論編寫及編譯 shader 的步驟﹐ 這是一個很大的題目
( 非常、 非常之大﹐ 而我現在還沒太多的點子﹐ 要好好的準備才行 )。
在上一篇文中提到﹐ 要產生一幅圖﹐ 我們用﹕
rendrib fichero.rib
把結果寫到文件中﹐ 或用
rendrib -d fichero.rib
把結果輸出到屏幕
相機擺放基礎
相機的坐標系是“左手規則”系統﹐ 與顯示屏幕一致。
原點在屏幕正中﹐ x 軸指向右﹐ y 軸向上﹐ z 軸向內。
在缺省狀況下﹐ “當前坐標系”與相機坐標系完全一致﹐ 就像第一幅圖所示 (x 軸紅色,
y 軸綠色﹐ z 軸藍色)。
第一幅圖展示了一只鳥的眼睛看ぴ場景﹐ 而第二幅圖展示所看到的場景 (為了讓圖像更清晰﹐
兩幅圖中的光源並不在同一地點)。
雖然場景並不複雜 (還挺難看)﹐ 但是因為沒有複雜的幾何模型﹐
使得我們的 RIB 示範文件容易閱讀。
下面讓我們看看如何擺放相機。
移動相機是最合邏輯的方法﹐ 特別是對 Pov-Ray 的用戶而言。
為了從更遠的地方看場景﹐ 我們希望移動相機到 <0,0,-20> 的位置﹐ 相當於向后移動相機。
在 RenderMan 中﹐ 移動由命令 Translate 0 0 -20 完成
(此命令要放在 WorldBegin 前)﹕
然而這一命令把相機向前移了﹗
實際上相機沒動﹐ 是坐標系動了。
整個坐標系向后移了﹐ 把相機留在了前面。
所以要把相機向後移﹐ 我們要反過來想﹐ 相機不動﹐ 而坐標系向前移動
(用命令 Translate 0 0 20)﹕
現在相機所在的位置正是我們所要求的。
在以下的文章中﹐ 所有場景位置的變化都是對應於現在的坐標系。
下一個例子中﹐ 模型在原點﹐ 我們繞它轉動相機﹕
看看 RIB 文件﹐ 注意坐標系的轉換是如何加到相機上的﹕
Display "camara_default2.tif" "file" "rgb"
Projection "perspective" "fov" 45
Format 320 240 1
LightSource "ambientlight" 1 "intensity"
0.3 "lightcolor" [1 1 1]
LightSource "distantlight" 2 "intensity"
1.0 "from" [10 10 -10] "to" [0 0 0]
Translate 0 0 20
Rotate 45 1 0 0
Rotate 135 0 1 0
WorldBegin
Color 1 1 1
# Background blanco
Sphere 10000 -10000 10000 360
# Objeto de la escena
TransformBegin
Color 1 0 0
Sphere 3 -3 3 360
TransformEnd
TransformBegin
Rotate -90 1 0 0
Translate 0 0 2
Cone 3 3 360
Disk 0 3 360
TransformEnd
TransformBegin
Rotate -90 0 1 0
Cylinder 1 -4 4 360
Disk 4 1 360
Disk -4 1 360
TransformEnd
WorldEnd
這兒有一次平移 (Translate 0 0 20)﹐ 兩次轉動﹐ 一次繞 x 軸
(Rotate 45 1 0 0)﹐ 另一次繞 y 軸 (Rotate 135 0 1 0)。
也許這個例子中命令的順序令 Pov-Ray 的用戶感到迷惑。
因為在 Pov-Ray 中﹐ 命令是按順序執行的﹐ 但在 RenderMan 中卻不同。
RenderMan 將命令存放於一個命令對中﹐ 直到遇到一個特殊命令 (在我們的例子中為
WorldBegin)﹐ 才開始執行命令。
由於命令對的存放方式﹐ 導致命令是按逆順序執行的。
也就是說﹐ 最後一個命令先得到執行。
所以在我們的例子中﹐ 坐標系的變換是按以下順序轉變的﹕
1. 初始態
|
|
2. 繞 y 軸轉 135 度
|
|
3. 繞 x 軸轉 45 度
|
|
4. 沿 z 軸方向平移 20 個距離單位
|
|
不要忘記所有坐標系的變換 (轉動和平移) 都是相對於相機而言的。
所以繞 x 軸轉動應理解為“繞相機 x 軸轉動”
現在我們要進入本文最有趣的部份﹐ 怎樣用 RenderMan 的相機模型產生特殊效果。
動態模糊 (模擬移動物體)
第一個相機效果是動態模糊﹐ 用來模擬移動的物體在底片上留的影子。
動態模糊是由命令 Shutter 0 1實現﹐ 此命令用在例子中有關相機特性的部份。
Shutter 0 1 命令模擬相機曝光時間。
在這兒相機快門在時間 0 打開﹐ 持續到時間 1 關閉。
快門參數 0 1 是普遍使用的參數值。
我們將一直用這兩個參數值﹐ 因為它只確定了一個 RenderMan 相機的特定行為。
接下來﹐ 我們必須告訴 RenderMan 場景中那些元素是移動ぴ的。
我們用標籤 MotionBegin MotionEnd 來告知 RenderMan。
下圖展示了一個球體在時間 0 到 1 內從 0 10 5 移動到 5 10 0。
點按在圖上﹐ 可以看 RIB 源文件。
MotionBegin [0 1] 命令 告訴 RenderMan 移動的准確時間﹐ (時間 0 對應於第一個﹐時間 1 對應於第二個)。
這兩個值必須和 Shutter 的參數一致。
下圖展現的效果真實感挺強﹐ 如果做成動畫﹐ 效果更佳。
當然﹐ 在 MotionBegin MotionEnd 之間的變換並不局限於線性變換。
RenderMan 的動態模糊也可用於非線性軌跡的變換。
在下面的例子中﹐ 我們展示坐標軸繞 y 軸作 25 度角的轉動。
在一般情況下﹐ 只有場景中的物體在移動。
然而 RenderMan 也允許相機本身的移動﹐ 所以動態模糊也可運用在相機上。
在下面的例子中﹐ 我們把相機向右平移 5 個距離單位 (也就是坐標向右平移 5 個距離單位)。
場景中所有的物體都變模糊了。
當然那一對標籤 MotionBegin MotionEnd 必須放在相機特性部份﹕
景深 (聚焦)
最後介紹 RenderMan 提供的另一有趣效果﹕ 景深﹐ 相機的聚焦系統。
這一效果的實現是由命令 DepthOfField 完成。
這個命令需三個參數﹕f-stop﹐fov (field of view) 和 focus-length (焦距)。
第一個參數 f-stop﹐ 確定系統聚焦截止距離。
在我們的例子中﹐ 離相機 2 個距離單位內的物體會顯出相同的散焦 (或聚焦)。
當投影透視角設定為 Projection "perspective" "fov" 45 時
( 如例中所用 )﹐ 參數 fov 通常設為 1.0。
改變此值﹐ 其結果相當於將投影透視角乘以此值。
最後一個參數 focus-length 是我們真正感興趣的﹐ 它確定了物體被聚焦的距離。
在下面的例子中﹐ 相機在原點﹐ 三個球體分別在 10﹐20﹐和 30 個距離單位以外。
我們會展示用不同的 focus-length 值達到的不同效果。
第一幅圖用 DepthOfField 2.0 1.0 10。
那麼任何離相機 10 距離單位的物體都會被聚焦 (紅球)﹕
第二幅圖用 DepthOfField 2.0 1.0 20。
在相機外 20 距離單位處的綠球被聚焦了﹕
最後我們聚焦在最遠的藍球上 (在 30 距離單位以外)﹐ 要用 DepthOfField 2.0 1.0 30﹕
這些效果, 使得產生出來的圖像更加逼真﹐ 當然計算這些圖像的時間也增加了。
動態模糊和景深, 都需要反復幾次的計算才能完成。
|