2012年4月4日 星期三

基本向量運算

    為了理解三個維度的向量運算,在圖示方面我們使用二維的圖示。這兩者在理解上差異不大,但對初接觸的人來說,用二維的圖示較為容易理解。

常見的三維向量運算有以下幾種:
  • 向量長度
  • 向量縮放
  • 加法、減法
  • 正規化
  • 內積運算
  • 外積運算
  • 座標系統轉換

    在理解所有的運算時,第一要務是,將運算的基準點設定成原點O來理解。 也就是說,不論運算的基準點在空間的何處,我們都必須先將運算時的座標系原點設定成該基準點。以專業一點的文字來說的話,就是我們在理解向量的運算時,是以基準點的區域座標系(local coordinate systems)來看。

    區域座標系的簡單定義就是,以運算基準點為原點的座標系統稱之為區域座標系。相對於區域座標系這個名詞,還有一個所謂的絕對座標系(global coordinate systems)。不過以理論上來說,所有的區域座標系都可以是絕對座標系,也就是說其實這兩者的差異並不大,差別只在於實際運用時,運用者的角度決定了兩者的差異。

    舉一個簡單的例子來說明,假設我們有一個母空間A,在A內還有兩個子空間B1, B2。這三個空間分別有三個不同的座標系統分別為Sa, Sb1, Sb2。 我們將視點放在A空間時,很明顯的Sa可視為絕對座標系,而Sb1及Sb2則為區域座標系。而當我們把視點放在B1空間時,則Sb1則可視為絕對座標系,甚至在某些時候,還必須將Sa座標系視為區域座標系。

    說明至此,或許會造成看官們的混淆,筆者也不打算在此多加著墨。僅提出一個基本原則,在做向量運算時,第一步就是先定義出這一次的運算所使用的座標系統。至於這個系統到底被分類為絕對座標系或區域座標系,其實不是非常重要。

    另一個要先說明的事項是,除非我們有特別指定該運算用到了原點O,否則在我們的討論中,所有參與運算的向量都不可為零向量(各分量皆為0的向量)。 

    接下來,我們開始解釋向量的基本運算。以下圖為參考圖,我們先有一個原點O,接著有兩個向量A、B。將分量表現進去時則兩個向量為A(ax, ay, az)與B(bx, by, bz)。



我們依照前面列出的順序來說明相關的項目:
  1. 向量的長度

  2.     首先我們先了解向量的長度。向量的長度定義很簡單,A向量的長度length(A)被定義成點向量A到原點O之間的長度。相同的,B向量的長度則為點向量B到原點O之間的距離。我們用下面這個簡單的數學式描述:
         length(A)=L(A)=sqrt(ax2 + ay2 + az2)。
        同理 L(B)=sqrt(bx2+ by2 + bz2)。

  3. 向量的縮放

  4.     有了向量的長度之後,便可定義向量的縮放。在定義上,向量A放大到原本的兩倍成為了向量C時,代表著向量C與向量A有著相同的方向,而向量C的長度是向量A的兩倍。用數學式表示時,假設向量C為向量A縮放成 k 倍後的向量時,則C = k*A。在將分量放進去考慮時:
        C(cx, cy, cz) = k * A( x, y, z),其中 cx = k*x, cy = k*y, cz = k*z

        接著我們來看一個例子,當縮放的倍數k為負一時,向量C是否有問題。C = (-1) * A,使用分量的運算式後,可以得到C(cx, cy, cz) = (-1) * A( x, y, z) = (-x, -y, -z) 的結果。由空間點座標的定義來分析時,我們可以發現點向量A相對於原點O的對稱點就是點向量C。也就是說,向量C的方向剛好與向量A相反,且向量C的長度相等於向量A的長度。換言之,以向量縮放的公式來看,該公式可以縮放負值的倍數,而負數的意義,代表著是向量方向改成原本方向的逆向。

  5. 向量的加法、減法

  6.     接著我們來了解向量的加法。對於向量A而言,我們可以認知到,所謂的A向量,若以點座標的概念來看時,A向量可以解釋為從原點O(0, 0, 0)往A向量的方向前進L(A)的距離,來到點向量A(ax, ay, az)的位置。同樣的B向量則是從原點O(0, 0, 0)往B向量的方向前進了L(B)的距離,來到點向量B(bx, by, bz)的位置。

        有了這樣的慨念後,我們對向量的加法做了下面的定義:向量A+向量B代表著,從原點O出發,往向量A的方向前進了L(A)的距離;然後往向量B的方向,前進了L(B)的距離;最後到達了點向量P1的位置。以數學式來看:P1=A+B。若再將分量放進去,則是:
        P1(p1x, p1y, p1z)=A(ax, ay, az) + B(bx, by, bz),

        其中 p1x = ax+bx, p1y = ay+by, p1z = az+bz

        從圖示來看,不論是先往向量A的方向前進或是先往向量B的方向前進,最後都會到達點座標P1的位置。用數學式來看,則是P1=A+B=B+A。這代表著,在向量的加法中,不論先加哪個向量,其結果不會因為運算的順序而改變。

        了解了向量加法後,現在來看向量的減法。在理解加法時,加上向量A意味著朝著向量A的方向前進了L(A)的距離。而在減法中,減掉向量A則是朝著A的反方向前進了L(A)的距離。所以如果要計算從原點O減掉向量A時,就代表著從原點O往向量A的反方向前進了L(A)的距離,而來到了點向量P3的位置。

        使用同樣的方式來看A-B這個運算結果,我們可以理解成,從原點往向量A的方向前進了L(A)的距離後,朝著向量B的反方向前進了L(B)的距離而來到了點向量P6的位置。以數學式來表示則是:P6=A-B。再將分量放進去時,得到:
        P6(p6x, p6y, p6z) = A(ax, ay, az) - B(bx, by, bz),
        其中 p6x = ax-bx, p6y = ay-by, p6z = az-bz

        說明至此,筆者已盡可能的使用口語化的文字及幾何的方式來描述向量的加法與減法,希望能讓看倌們理解筆者所要表達的幾何意義。正規而言,筆者並沒有正確的說明在分量的表示式中,為何是上面的算式結果。要將分量的加減法說明清楚所需要的篇幅實在過大,筆者就此省略,請有興趣的看倌們參閱與線性代數(Linear Algebra)相關的書籍文獻。

        整合上面對向量加減法的說明,上面的圖例中的各點有著下面的數學式結果:
    • P1 = A + B
    • P2 = (-1) * A + B = B - A
    • P3 = (-1) * A = -A
    • P4 = (-1) * A + (-1) * B = -A -B
    • P5 = (-1) * B = -B
    • P6 = A + (-1) * B = A - B
        上面的數學式中,每個等號都可以有其獨立的幾何說法,請有興趣的看倌思考之。

  7. 向量的正規化

  8.     接下來,我們要說明的是,向量的正規化。在前一篇向量概念 - 笛卡爾座標中有提到單位方向向量這個特有向量。所謂的向量正規化就是計算出該向量的單位方向向量。也就是說,對於向量A而言,其正規化後的向量N(nx, ny, nz)是與向量A有著相同方向,且向量長度為1的單位向量。參考向量縮放的概念,向量A的長度為L(A),若要將長度縮放成單位長度1,則代表著要縮放成原本的 1/L(A) 倍。因此,正規化的數學式為:
        N(nx, ny, nz) = 1/L(A) * A(x, y, z),
        其中 nx = x / L(A), ny = y / L(A), nz = z / L(A)。

        若用口語的說法則是:對一個向量做正規化,就是將該向量的各分量除以該向量的長度即可。

  9. 向量的內積運算

  10.     在數學中,兩個向量的內積運算所得的結果是一個數值。其運算式如下:
        c = A ∙ B = A(ax, ay, az) ∙B(bx, by, bz) = ax*bx + ay*by + az*bz

        若要了解其幾何意義,有個與其相關的幾何公式可以參考:

        c = A ∙ B = L(A) * L(B) * cos(θ),其中 θ 為向量A與向量B之間的夾角。

        當我們使用這個公式時,若假設向量B是個單位向量時,我們會發現L(B)=1,也就是說上面的計算式會變成 A ∙ B = L(A) * cos(θ) 。配合上面的圖示,我們可以發現,當我們把向量A對一個單位向量B做內積運算後,其結果會等同於向量A垂直投影到單位向量B上的長度。我們在後面討論座標轉換運算時,會用到這個特性。

        另一個常被用到的特性是,當兩個向量長度都不為零的情況下,內積的運算結果若為零,代表著cos(θ)=0,也就是兩個向量相互垂直。

  11. 向量的外積運算

  12.     兩個向量的外積運算結果,會是另一個向量,這個向量會與運算前的兩向量相互垂直。以數學式表示,則如下:
        C(cx, cy, cz) = A(ax, ay, az) ╳ B(bx, by, bz),
        其中cx = ay*bz - az*by, cy = az*bx - ax*bz, cz = ax*by - ay*bx。

        而在幾何上,除了向量C垂直於向量A及向量C垂直於向量B之外,還有著L(C) = L(A) * L(B) * sin(θ)的特性( θ 為向量A與向量B之間的夾角)。

        在外積運算中,A╳B 的結果與 B╳A 是不同的,主要的差別在於兩者的方向正好相反,而正確的方向,可由右手定則來確認。以筆者的實作經驗來看,會被使用到的特性是與兩向量相互垂直,這個特性主要運用於建立新的座標系上。

  13. 座標系的轉換


  14.     在說明座標轉換時,我們先設定一些先決條件。O1為XYZ座標系的原點,其三個基準軸的單位向量分別為X, Y, Z。P點為空間中的一點,用XYZ座標系表示時,其點座標為P(px, py, pz)XYZ。O2為UVW座標系的原點,其三個基準軸的單位向量分別為U, V, W。而O2在XYZ座標系上的點座標為O2(o2x, o2y, o2z)XYZ。我們要在此討論的運算有二:
    • 從O1指向P點的方向,該如何用UVW分量來描述。
    • 如何取得P點在UVW座標系上的點座標。

        首先,我們必須先將向量X用UVW座標系來表示。也就是說,在XYZ座標系時,X向量為(1, 0 ,0)XYZ,而在UVW座標系時,X向量為(xu, xv, xw)UVW,我們必須先計算出這三個分量xu, xv, xw

        在解釋內積運算時,我們提到了當一個向量與一個單位向量做內積運算後,得到的數值是該向量在該單位向量上垂直投影的長度。利用此特性,我們將向量X對單位向量U做內積運算,便得到了X在單位向量U上的垂直投影長度,而這個長度剛好就是X向量在UVW座標系中,對應於U軸的分量。也就是說,xu = X∙U。同理可延伸到V及W軸,得到X向量在UVW座標系中的表示式為:
        X(xu, xv, xw)UVW,其中 xu = X∙U, xv = X∙V, xw = X∙W。

        接著,Y向量與Z向量在UVW座標系的分量也可以利用相同的方式計算出來。

        有了X、Y、Z三向量在UVW座標系上的分量表示式後,我們就可以使用UVW座標系的分量分量來描述從O1指向P點的方向。

        我們知道要求的方向為P(px, py, pz)XYZ,由之前提到的向量縮放及加減法慨念來看時,我們可以得到:
        P(px, py, pz)XYZ= px * X + py * Y + pz * Z
        = px*(xu, xv, xw)UVW+py*(yu, yv, yw)UVW+pz*(zu, zv, zw)UVW
        = (px*xu+py*yu+pz*zu,
            px*xv+py*yv+pz*zv,
            px*xw+py*yw+pz*zw)UVW

        接下來我們來求P點在UVW座標系上的點座標。由幾何的關係來看,我們知道P點在UVW座標系上的點座標是由O2點指向P點的向量。在XYZ座標系中,這個向量為 P - O2 = (px-o2x, py-o2y, pz-o2z)XYZ,而將此向量用UVW座標系表示後,就是我們要求的點座標。因此我們可以得到:
        P(pu, pv, pw)UVW
        = (px-o2x) * X + (py-o2y) * Y + (pz-o2z) * Z
        = (px-o2x) * (xu, xv, xw)UVW +
           (py-o2y)* (yu, yv, yw)UVW +
           (pz-o2z) *(zu, zv, zw)UVW
        其分量的運算結果為:
        pu = (px-o2x)*xu + (py-o2y)*yu + (pz-o2z)*zu
        pv = (px-o2x)*xv + (py-o2y)*yv + (pz-o2z)*zv
        pw = (px-o2x)*xw + (py-o2y)*yw + (pz-o2z)*zw

        以上兩個座標系轉換的例子分別為方向的轉換及位置的轉換,只要能了解其差異性,在實作上應不會有座標系轉換錯誤的問題發生。
    向量的基本運算到此算是介紹完畢。不同於一般常見的矩陣運算,在這邊筆者以幾何及向量的角度來說明這些運算,提供另一種詮釋的方式給各位看倌參考。

2012年4月1日 星期日

向量概念 - 笛卡爾座標

   向量是數學上建構3D物件的最基本元件。習慣上,使用三個分量(x, y, z)來描述一個向量。

    在描述一個空間時,會在空間中選定一個特定點作為基準點,該點稱為原點O,且原點的三個分量數值皆為0。原點選定後,接著以原點為中心選定三個相互垂直的方向軸作為基準軸,一般而言,使用X軸、Y軸、Z軸來代表。

    三基準軸確認後,連帶的相互垂直的三基準面也被定義出來:



  • XY平面由X軸及Y軸所構成。
  • YZ平面由Y軸及Z軸所構成。
  • ZX平面由Z軸及X軸所構成。

    當原點及三基準軸皆被定義後,該空間中的任何一點,都可以用(x, y, z)三個分量來表示。 當空間中一點用P(px, py, pz)表示時,我們可以將分量px, py, pz理解如下:

  • P點垂直投影到YZ平面的距離為分量px的絕對數值。
  • P點垂直投影到ZX平面的距離為分量py的絕對數值。
  • P點垂直投影到XY平面的距離為分量pz的絕對數值。

    我們應可發現,由於距離是正的數值,所以我們在上面是使用分量的絕對值來理解。但我們知道分量 px 與分量 -px 的絕對值是相同的。這代表著,如果只用距離的概念來時,我們會發現P(px, py, pz)與P'(-px, py, pz)代表的是同一個點,然而這是有問題的。事實上,P點到YZ平面上的距離的確相等於P'點到YZ平面上的距離,但是我們會希望這兩者是不同的兩點。

    我們先回到上面說明三基準面的部分。為了不要一次定義太多東西以方便理解,前面我們只說了,YZ平面由Y軸及Z軸所構成,這樣的說法其實省略掉了另一個訊息。我們以空間的角度去看YZ平面時,會發現整個空間被YZ平面切割成兩個區域。一個區域與X軸的方向相同,另一個區域與X軸的方向相反。依上面的圖例來說,YZ平面將空間切成了左右兩邊。使用口語來說的話,則是一個平面有兩個面,正面及反面。一般而言,我們在定義空間的一個面時,會同時定義出一個法向量。法向量指的是垂直於該平面的方向向量(方向向量的詳細說明容後再解釋)。一個平面將空間切割成兩個部分,面向法向量的那一邊,我們稱之為正面;反向於法向量的那一邊,我們稱之為反面。

    基於上面的概念,我們重新定義三個基準面:
  • XY平面由X軸及Y軸所構成,其法向量為Z軸。
  • YZ平面由Y軸及Z軸所構成,其法向量為X軸。
  • ZX平面由Z軸及X軸所構成,其法向量為Y軸。

    接著我們將焦點回到P(px, py, pz)及P'(-px, py, pz)上面。 我們已經知道YZ平面有分正面及反面,且正面指的是與X軸同一方向的那一面。以YZ平面的角度去看P與P'點時,我們可以知道其中一點的x分量為正值,而另一個x分量為負值;我們定義了x分量為正值的那一點是位於YZ平面正面的那一邊,而x分量為負值得那一點則位於YZ平面的反面那一側。如此一來,我們就將P與P'點區隔開來。

    接著我們將問題再擴大,如以距離的絕對值來看,以下八點(px, py, pz)、(-px, py, pz)、(px, -py, pz)、(-px, -py, pz)、(px, py, -pz)、(-px, py, -pz)、(px, -py, -pz)、(-px, -py, -pz)相對於三基準面而言,皆有著相同的距離。而我們將三基準面的正反面的慨念導入後,這八點就會分別獨立出來。

    為了更容易理解,我們可以對點到平面的垂直距離做了一點修正。以往提到距離時,其數值都是零或正數。當平面的法向量被定義出來後,我們可以對[點到平面的垂直距離]作一個小修改,也就是此距離可以是負值。當點位於平面的正面那一側時,距離定義為正值;而當點位於平面的反面那一面時,其距離則定義為負值。如此一來,空間中一點P(px, py, pz)所代表的意義是:P為空間中的一特定點,且同時符合下列三個條件:
  • P點到YZ平面的垂直距離為分量px。
  • P點到ZX平面的垂直距離為分量py。
  • P點到XY平面的垂直距離為分量pz。
    說明至此,我們總算可以理解如何使用數學上的向量來描述對空間中的點。當我們定義好原點及三基準軸,空間中的任何一點都可依上面的定義取得代表該點的三個獨立且唯一的分量。也就是說,空間中的任何一點都可用一個向量<x, y, z>來描述其所在位置。而對於用來描述一個點所在位置的向量,我們稱之為點向量

    向量除了可以用來描述點的位置之外,還可以用來描述空間中的一個特定方向,這種用來描述方向的向量,我們稱之為方向向量

    位置方向是常被放在一起討論的,在3D空間中,當我們將原點及三基準軸定義出來後,所有點的位置皆被定義出來,然而對於方向而言則不是如此。

    從A點到B點的方向是一句標準的語言,由這句話我們可以清楚的知道,在使用方向時,必須先有一個基準點及一個目標點,接著從基準點拉一條虛擬的直線直指目標點,這條虛擬直線就是我們所說的方向。

    在使用方向向量時,我們會先將基準點設定成原點,如此一來,空間中的任何一點都可以是我們所要的目標點,而原本的點向量,便可用來表示從原點到該點的方向。以這樣的認知為出發點,方向向量可視為原點為基準點的點向量。

    由方向向量的角度去理解空間時,我們會發現,一個基準軸,如X軸,有正向及反向這兩個方向。在X軸上,X紛向為正值的所有點向量,對於原點而言,皆在同一個方向上。這代表著一件事情,當我們將點向量視為方向向量時,會發現對於同一個方向而言,有無數個點向量可以代表之。這樣的現象在許多運用面上會造成困擾。因此我們再定義了一個更嚴謹的單位方向向量。會造成一個方向有無數個點限量可以描述,是因為這些點對原點而言,雖然方向都相同,但距離原點的距離卻是不同的。在這無數的點向量之中,我們挑出離原點的距離為單位距離1的點來代表這個方向,並將這個點向量稱之為單位方向向量

    截至目前為止,我們可以使用數學上由三個分量所組成的向量來描述空間中的任何一點及任一方向,這個定義方式被稱之為笛卡爾座標系統(Cartesian coordinate systems)。笛卡爾座標系是常被使用,且容易理解的虛擬空間座標系統。然而,在數學上仍有其他的座標系統可以用來描述空間,如看官們有興趣,不仿參閱相關的書籍。

基本概念

首先,先說明global illumination rendering system是怎樣的系統。簡單的說,就是使用電腦程式運算出盡可能符合物理光學的圖像。
上圖便是筆者在2001年左右開發的第一個系統所運算出來的影像結果。
要建立出這樣的系統,有幾個必要的子系統必須被建立。
  1. 3D物件基本結構描述系統。包括:
    • 向量資料結構必須備建立。這是要使用數學來描述3D空間的最基本要件。
    • 光線(Ray)的描述結構必須被確認。 這是一個虛擬的慨念,主要描述[光能]從何處往哪個方位傳遞。一般而言,用光的粒子說來理解較為容易,但這並不代表這樣的概念無法使用在波動說或量子光學等近代的光學中。
    • 3D物件的描述。現實中最常被用的3D物件是三角形。但在數學上,只要能用數學函數式描述出來的幾何結構,都是可以被用來建立3D物件。
  2. 相機成像系統。在筆者規劃的系統中,電腦運算的是以光線(Ray)為基本的架構。因此,每一次的運算所計算的是單一條光線。然而,一條光線並無法構成一個影像,因此必須透過相機成像系統來規劃出該計算哪些光線來達成所要的影像。一般而言,基本的相機成像系統有[點投影成像系統]、[單透鏡成像系統]、[多透鏡成像系統]等。
  3. 3D物件材質描述系統。這個系統也有點難以具體化,其主要的用意在於描述當[光能]傳遞到空間中一特定點後所產生的物理反應。
    一般而言,特定點指的是物體的表面,但若系統要描述煙霧或灰塵等效果時,此特定點則有可能是空間中的任一點。
    而物理反應一般指的是能量的反射、折射、散射等現象,更深入一點,則須考慮能量的轉換現象(螢光現象、黑體輻射等)。
  4. 能量轉換成影像的系統。由於筆者想不出該用哪個名詞來描述此系統,就直接用白話說明,主要是將[光能]轉換成圖像資料的技術。此系統的運作與tone mapping技術類似,但由於筆者的認知上,這兩者有本質上的不同,就不以tone mapping來代表此系統。

以上四個子系統是以global illumination rendering system的角度來劃分的系統。若以程式設計來看,這些算是大分類,實際規劃上則又更加複雜,筆者在此先不多加說明。

源起

這個部落格的建立,主要是要記錄筆者實作global illumination rendering system的經驗。筆者會依照實作的進行留下當時的想法及方向。
這些資訊中,應該會夾雜著許多簡化過的學理根據,甚至有些是沒被證實的光學推論。因此,請不要將這些資訊視為正規的學術研究。
另一方面,由於實作進行中,並無法完全預期之後的發展是否如預期,也可能會由前後不盡相同的狀況產生。
如果看倌們對文章的嚴謹性相當重視,在一開始,筆者先聲明,如有錯誤的科學資訊,乃因筆者的知識尚且不足,還請見諒。