update: 2013/08/29
reference:
0. 原文: Rendering 3D Anaglyph in OpenGL
A. 說明:
本系列為翻譯文章, 以及在 Mac OS X 上的實作練習, 翻譯的內容可能有所誤差
或尚未能完整表達原作著的意思, 並添加了部分個人的註解說明.
---------------------------------------------------------------------------------
B. 概要:
1. 使用 OpenGL 來畫出 3D 立體圖片(anaglyphs) 是一件相當容易(且有趣)的事.
希望你知道什麼是立體圖片(anaglyphs), 並且懂得如何去觀看它們. 如果不清楚
的話, 請閱讀之前的這篇文章. 這篇教學文章的焦點是要提供你足夠的背景知識,
與片段的程式碼來完成之後的工作. 之後, 你就可以在自己的程式中, 畫出有趣
的立體圖片.
2. 我們的焦點會放在: 從一個給定的 3D 場景, 來產生紅藍立體圖片
(red-cyan anaglyph). 這個場景將會被繪製二次: 一次是給左眼觀看的攝影機,
僅允許讓紅色光線通過; 另一次是給右眼觀看的攝影機, 僅允許讓青綠色(綠+藍)
光線通過. 要實作這個想法, 你需要了解在立體視覺(stereoscopic vision)當中,
視差(parallax)所扮演的角色, 以及應用在 OpenGL 上的投影(projection)與
視野(viewing)之概念. 這篇教學文章假定你熟悉 OpenGL 投影(projection)與
模型視野(modelview)的轉換( transforms), 如果你了解那些內容就繼續閱讀;
不然的話, 請閱讀 紅皮書 中的這個章節, 以作好準備.
---------------------------------------------------------------------------------
C. 視差觀念:
1. 什麼是視差(parallax)? 當你未使用紅藍立體眼鏡來觀看 3D 立體圖片時, 會發現
圖片中物體的邊緣有紅色與青綠色的成份. 請觀察底下的圓柱體(cylinder):
圖一: 浮雕例子 - 圓柱體
2. 在現實裡, 我們眼中的物體藉由在左眼與右眼間橫向位移的量產生了立體感, 因此, 在平面的影像上(照片或顯示螢幕), 人類的視覺系統需要深度(depth)的
訊息, 才能產生立體的視覺效果. 當我們談到視差, 就是意指影像中的這種確切
的位移. 要在上方的圖片中看到視差的效果, 使用紅藍(red/cyan)立體眼鏡
(紅色在左眼), 並試著將滑鼠指標停留在稍微超出圓柱體左邊的末端. 這樣
看起來: 圓柱體左邊的末端是沈入螢幕內; 相反的, 圓柱體的前端(右邊)似乎
或多或少以相同的深度浮出螢幕. 所以, 要畫出浮雕(anaglyph)的效果, 我們
要試著去完成的是: 在場景中(scene)為物體取得正確種類的視差, 其餘的部分,
人類的大腦會免費自動地完成!
---------------------------------------------------------------------------------
D. 視差基礎:
1. 視差不僅是一種性質上的呈現, 它有數值, 並且可以是正值, 負值或零.
在應用中, 視差的建立基於以下: 定義二個對應於分隔一段距離的左右眼
(稱為: 二眼之間的距離或簡稱: 兩眼間隔)之攝影機, 並且沿著視線方向在
某個深度會有一個平面(稱為: 收斂距離 convergence distance), 在那裡,
視差為零. 位在收斂深度上的物體, 看起來與螢幕是在相同的深度. 物體位在
比收斂距離更接近攝影機的地方, 看起來似乎是從螢幕走出來; 而物體位在
比收斂距離更深遠的地方, 看起來似乎是在螢幕內部. 下面的圖例說明了
這些狀況:
圖二: 位在不同深度的頂點視差
2. 在這張圖片中, 有二個虛擬的攝影機, 一個是模擬左眼的位置(沿著 X 軸方向,
對原點上作少量的負位移), 另一個是模擬右眼的位置(沿著 X 軸方向, 對原點
上作少量的正位移). 這二個攝影機被分開的距離, 等同人類左右眼之間的位移量,
其值平均大約是65公釐(6.5公分). 於是, 會有一個零視差的深度稱為收斂深度.
你可以把它想像成是沿著負 Z 軸方向, 位在收斂深度的地方, 有一個順著 x-y 軸
的平面. 圖中顯示的三個頂點: v1, v2 和 v3, 將用來說明不同種類的視差.
3. 對每頂點(v1, v2 和 v3), 想像有條線分別從頂點連到每個攝影機, 並觀察與收斂
平面相交在何處. 左右眼攝影機在收斂平面上交會的二點之間隔, 就是該頂點所
產生視差的判斷基準:
a. 頂點 v1:
相對於收斂處, 位於更大的深度而產生了視差. 可以觀察到在收斂平面上的紅點
與青綠(cyan)點, 與二個攝影機是同向性的: 紅點是朝著左邊的攝影機方向, 青綠
(cyan)點是朝著右邊的攝影機方向. 這樣子稱為正視差, 而且當影像繪出時, 頂點
v1 會顯示在螢幕內部(沈入).
b. 頂點 v2:
位於與收斂平面相同深度的地方產生零視差. 正如之前的例子, 在此, 收斂平面
處沒有被分隔的紅點與青綠(cyan)點. 當影像繪出時, 頂點 v2 會顯示在與螢幕
相同深度的地方.
c. 頂點 v3:
位在比收斂距離小的地方, 也產生了視差. 但是投射在收斂平面上的紅點與青綠
(cyan)點, 與攝影機的位置是反向的. 對應到左邊攝影機的點在收斂平面上是偏往
右邊, 而對應到右邊攝影機的點在收斂平面上是偏往左邊. 這樣子稱為負視差,
而且當影像繪出時, 頂點 v3 似乎顯示在螢幕外部(浮出).
4. 再看看另一個浮雕, 說明了頂點在不同的深度所產生的典型視差:
圖三: 二十面體所顯示的負, 零與正視差(比原圖失真許多)
5. 在圖中, 有三個二十面體. 在底部的那一個, 是場景中最遠的; 在頂部的那一個,
是離攝影機最近的. 位在中間的二十面體, 是幾乎與螢幕位在相同的深度. 注意到
產生最近和最遠二十面體的視差方式, 是有著相反的組合.(以下解釋) 最近的二十
面體, 右邊有紅色的邊緣, 左邊有青綠色的邊緣. 當用3D紅藍眼鏡觀看, 這表示
負視差(紅色濾鏡在左眼), 二十面體稍微地顯示在螢幕外部(浮出). 然而, 圖片中
底部最小的二十面體, 左邊有紅色的邊緣, 右邊有青綠色的邊緣. 這種組合與用來
觀看的有色眼鏡是相同的. 所產生的是正視差, 二十面體顯示在螢幕內部(沈入),
在位於中央二十面體的後面. 而位在中央的二十面體, 是與螢幕有著相同的深度,
畫出來幾乎沒有視差(零視差).
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。