最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

3D 成像原理

2023-01-19 01:20 作者:Zweitestock  | 我要投稿

虛擬相機是圖形學實踐無法回避的一個話題。

曾經(jīng)有一個問題困擾過我:在 Ray Tracing 中,我們從虛擬相機發(fā)射了一條光線,光線與屏幕相交然后和進入場景之中,擊中場景中的物體,再從擊中點要么尋求和光源是否有直接連線,要么從擊中點發(fā)出新的光線,然后以此為依據(jù)隊屏幕像素進行著色。

這是一個非常合理的過程,屏幕和物體都處在合理的順序上。但不要忘了虛擬相機和屏幕之間是有一部分間距的,要是物體位于這個間距之間呢?那我們剛剛的理論似乎說不通了,但事實是,這種情況仍然能夠成像。這是為什么呢?讓我們一起探討一下成像原理吧。

相機成像

攝影的原理主要包括兩個部分:

  • 將圖像存儲在膠片或者文件中

  • 在相機中生成圖像

我們主要關(guān)心后者。現(xiàn)實世界中最簡單的相機類型是針孔相機,圖形學中的虛擬相機常常模擬的也是針孔相機的特性。當然也有更加復雜逼真的相機模型,但這并不在本文的討論之列。

針孔相機對應的物理現(xiàn)象是小孔成像,其背后的光學依據(jù)是光沿直線傳播。

小孔成像

所謂小孔成像,即在物體和成像平面之間放置一個帶孔平面,那么成像平面上就會形成物體的倒像,如圖:

針孔相機

光圈

在針孔相機中,這個小孔被稱作是光圈。所有進入相機的光線都會匯聚到這一點,并在另一側(cè)發(fā)散。

光圈的大小控制成像的清晰度:光圈越小,成像越清晰。光圈越大,成像越模糊。

如下圖所示,光圈足夠小時,物體上 A 點在成像平面上對應 A’,而當光圈較大時,A 點就會對應多個點(實際上是 A’A’’ 整個區(qū)域)。所以造成了成像的模糊。

光圈的大小也和物體的大小相關(guān),當物體很大時,較大的光圈也可以生成可以接受的圖像。因為對于較大的物體,我們并不苛求它的每個細節(jié)都盡善盡美。不過光圈越小,分辨率越高。

不過光圈也并不是越小越好,光圈越小,通過的光線也就越少,成像的亮度會降低,光圈太小還可能造成隊成像不利的衍射反應。

曝光時間

正如上文所說,光圈越小,固定時間內(nèi)通過的光線也就越少。為了到達成像所需的光量,就需要一定的曝光時間。我們希望曝光時間越短越好,所以需要在清晰度和曝光時間中折衷取舍。

透鏡相機

透鏡相機解決的就是曝光時間過長的問題。

其工作原理可以簡單描述為在光圈處放置一個凸透鏡,凸透鏡可以收集進入相機的光線,然后再將其匯聚到成像平面上的一點。其成像規(guī)則遵循凸透鏡成像的規(guī)則:

>?焦距:透鏡的光心到光聚集之焦點的距離

  • 當物距大于2倍焦距時,則像距在1倍焦距和2倍焦距之間,成倒立、縮小的實像

  • 當物距等于2倍焦距時,則像距也在2倍焦距,成倒立、等大的實像

  • 當物距小于2倍焦距時,大于1倍焦距時,則像距大于2倍焦距,成倒立、放大的實像

  • 當物距等于1倍焦距時,則不成像,光線平行射出

  • 當物距小于1倍焦距時,則成正立、放大的虛像,此時像距大于物距,像比物大,物像同側(cè)

現(xiàn)實中的相機構(gòu)造并非如此簡單,它一般是多個凸透鏡和凹透鏡的組合,而且可以實現(xiàn)變焦,不過整體發(fā)揮的效用跟單獨的凸透鏡相似。

景深

景深指的是相機對焦點前后相對清晰的的成像范圍,在景深之內(nèi)的成像比較清楚,在這個范圍之前或者之后的成像則比較模糊。如圖所示:


景深通常是由物距、鏡頭焦距和鏡頭的光圈值共同決定的。景深的精確計算請參閱景深(https://zh.wikipedia.org/wiki/%E6%99%AF%E6%B7%B1)。

然而,因為針孔相機并不使用透鏡,所以它具有它一般沒有景深這個概念,即物體的清晰度和它距離相機的距離無關(guān)。我們可以使用針孔相機拍出完全清晰的圖像。

同理,如果我們在圖形學計算中模擬針孔相機也是具有無限景深的,場景中所有的對象都非常清晰。不過我們可以通過其他手段來模擬景深。

視場角

后文我們討論的相機類型如果沒有特意指出的話都默認為針孔相機,因為我們在圖形學實踐中經(jīng)常模擬針孔相機的一些性質(zhì),但并不完全等同于真正的針孔相機。

前文我們已經(jīng)定義過了透鏡相機的焦距(Focal Length),而針孔相機的焦距有所不同。針孔相機的焦距是從成像平面到光圈的距離。

關(guān)于焦距,我們可以發(fā)現(xiàn)以下性質(zhì):當成像平面越接近光圈時,成像越小,如下圖所示:

成像平面 P’ 對應的焦距是 f1,成像平面 P 對應的焦距是 f2,前者的成像區(qū)域 l’ 小于后者 l。

與此同時,在成像平面 P’ 所能看到的場景范圍要比 P 更大,因為同一物體占據(jù)了屏幕更小的范圍,意味著能夠容納更多的物體。

以我個人的經(jīng)驗來看,這一特性在實踐中經(jīng)常用到,特別是在描述相機性質(zhì)的時候,圖形學中將其稱之為視場角(Field of View,F(xiàn)OV)。

總結(jié)一下就是,焦距越小,視場角越大,可見的場景范圍越大。

視場角在在 3D 空間中分為兩種,水平視場角和垂直視場角,如圖所示:

我們在具體看一下視場角和焦距之間的關(guān)系:

假設我們使得 canvas size 始終等于膠片尺寸(事實上大多數(shù)情況下也正是這樣)。那么焦距,膠片尺寸,視場角這三者就是相互關(guān)聯(lián)的。

虛擬相機

虛擬相機的特性

我們在圖形學中經(jīng)常使用的虛擬相機和上文述及的針孔相機有所不同。主要表現(xiàn)在以下幾個方面:

  1. 如果使用光柵化技術(shù)進行渲染,那么虛擬相機會有一個近裁剪平面和遠裁剪平面。只有兩個裁剪平面之間的對象是可見的。

  2. 虛擬相機的成像平面位于相機光圈之前,而不是之后,所以成像也不是倒像,而是正像

現(xiàn)實中的相機受制于物理規(guī)則,成像平面不能位于光圈之前,而虛擬相機則不受這種限制。

而如果成像平面位于光圈之前,那么光圈的位置(也就是投影中心)就是視點的位置,也就是 Ray Tracing 中發(fā)射出射線的位置。

裁剪平面

裁剪平面是光柵化所必須的,卻不是 Ray Tracing 所必須的,通常在 Ray Tracing 中并不使用裁剪平面。

裁剪平面分為近裁剪平面和遠裁剪平面。二者位于虛擬相機之前,并平行于成像平面。比近裁剪平面更近或者比遠裁剪平面更遠的區(qū)域?qū)ο鄼C來說是不可見的。

虛擬相機的坐標系

我們想建立關(guān)于虛擬相機的坐標系。想象一下,這個坐標系以相機位置,也就是光圈位置為原點,我們?nèi)绾瓮茖С銎?x, y, z 軸?

和觀察矩陣的推導類似,我們還需要一個 target 目標點和一個 up 向量。我們假設虛擬相機的坐標系是一個右手坐標系。推導過程如下:

在上面的右手坐標系中,成像平面可以位于 -w 軸上的任意位置。

而在 Ray Tracing 中,成像平面也可以位于 -w 軸上的任意位置。

當視點和成像平面之間的距離為1時可以簡化運算。

觀察坐標和世界坐標的相互轉(zhuǎn)化

是從觀察坐標轉(zhuǎn)換為世界坐標還是從世界坐標轉(zhuǎn)化為觀察坐標,取決于我們使用的渲染方式:

  • 如果是光柵化過程,是將物體的頂點坐標從世界坐標轉(zhuǎn)換為觀察坐標

    • 光柵化是以對象為中心的

    • 我們需要將對象的坐標經(jīng)歷一系列的轉(zhuǎn)換過程:局部坐標—世界坐標—觀察坐標—裁剪坐標—NDC 坐標—屏幕坐標

    • 圖像是由投影到圖像上的”點“(并不是點,只是比喻)集合而成的

  • 而如果是 Ray Tracing,則是從觀察坐標轉(zhuǎn)換為世界坐標。因為我們的光線是以虛擬相機坐標系構(gòu)建的

    • Ray Tracing 的運作方式與光柵化相反,是以圖像為中心的

    • 不是沿著光線的自然路徑從對象到相機,而是沿著相反的方向由相機到對象

UV 坐標的三維化

我們已經(jīng)討論完了 3D 成像的一些最基本的原理,盡管我們省略了很多細節(jié)。

讓我們重新回到最開始的問題。

在 Ray Tracing 中,我們從一個像素的位置開始,我們所做的主要工作就是將其轉(zhuǎn)換為成像平面上的一個點 P,連接視點 C 和 P 就能夠確認光線的方向,視點 C 就是光線的起點。

我們拿到的是像素坐標,設這個坐標為 P,需要對其進行歸一化,轉(zhuǎn)換到 NDC 空間中。然而雖然我們的坐標得到了標準化,但是缺失第三個維度也就是 z 值,我們需要手動指定 z 值,正如上文所言,z 值表示成像平面距離視點的距離,只是在虛擬相機的 -w 方向的值均可。也就是說,這個值是根據(jù)虛擬相機得到的,所以 P 的坐標現(xiàn)在正處于相機坐標系中。我們就假設其為 1.0 好了,我們不關(guān)心 x, y 兩個分量的值,所以現(xiàn)在 P 的坐標就是 (x, y, 1.0)。

你這時就要問了,為什么是 1.0 而不是 -1.0 呢?問得好,這個 1.0 代表的是視點到成像平面之間的距離。那這豈不是意味著我們的成像平面位于 我們的視點之后了?確實!如果我們的觀察坐標系是右手系的話確實如此,因為在觀察坐標系中相機的坐標始終是 (0, 0, 0),所以一旦我們指定了 P 的坐標是 (x, y, 1.0),那么在后續(xù)的變換中就不能使用上面推導的觀察矩陣了,因為我們是在假設它是右手系進行推導的,我們必須使用左手系推導得到的觀察矩陣。這也很簡單,在計算 w 軸的時候不乘以 -1 就好了:

有了觀察矩陣 cam,我們就可以將相機坐標轉(zhuǎn)換為世界坐標了:cam * p(x, y, 1.0)。

如果我們固執(zhí)地要使用右手坐標系推導觀察矩陣,那么 P 的觀察坐標就應該預設為 (x, y, -1.0)。原則就是,成像平面一定要位于視點之前。

至于為什么可以成像,讓我們以一段 RayMarching 的代碼為示例說明??梢钥吹?,我們最后成像和著色的依據(jù)是 intersection 焦點,只要計算出光線和物體的交點就能夠計算出著色!而這個交點即使物體在成像平面與攝像機之間也是可以計算出來的!我們亦可以用下面這段 shadertoy 代碼調(diào)試上文所說的左右手系問題和視點和成像平面之間的距離問題。

本文到此結(jié)束了,感謝你的閱讀。

3D 成像原理的評論 (共 條)

分享到微博請遵守國家法律
株洲县| 青阳县| 镇宁| 河北省| 丁青县| 湘西| 吉隆县| 通化市| 化德县| 怀宁县| 民勤县| 柳江县| 东明县| 甘德县| 宁明县| 崇明县| 长葛市| 澳门| 大埔区| 涿州市| 同德县| 敖汉旗| 江门市| 巴东县| 永嘉县| 冀州市| 芒康县| 金溪县| 嘉义市| 百色市| 长春市| 改则县| 平阳县| 呈贡县| 郓城县| 那坡县| 嘉荫县| 阳春市| 滦平县| 英德市| 赤壁市|