「技美之路 第02篇」圖形 1.2.1 向量基礎
點和向量
點(point)是n維空間(遊戲中主要使用二維和三維空間)中的一個位置,它沒有大小、寬度這類概念。在笛卡兒座標系中,我們可以使用2個或3個實數來表示一個點的座標,如P=(PxPy)表示二維空間的點,P=(PxPyPz)表示三維空間中的點。
向量(vector,也被稱為向量)的定義則複雜一些。在數學家看來,向量就是一串數字。你可能要問了,點的表示式不也是一串數字嗎?沒錯,但向量存在的意義更多是為了和標量(scalar)區分開來。通常來講,向量是指n維空間中一種包含了模(magnitude)和方向(direction)的有向線段,我們通常講到的速度(velocity)就是一種典型的向量。例如,這輛車的速度是向南80km/h(向南指明瞭向量的方向,80km/h指明瞭向量的模)。而標量只有模沒有方向,生活中常常說到的距離(distance)就是一種標量。例如,我家離學校只有200m (200m就是一個標量)。
具體來講
?向量的模指的是這個向量的長度。一個向量的長度可以是任意的非負數。
?向量的方向則描述了這個向量在空間中的指向。
向量的表示方法和點類似。我們可以使用v=(x,y)來表示二維向量,用v=(x,y,z)來表示三維向量,用v=(x,y,z,w)來表示四維向量。
為了方便闡述,我們對不同型別的變數在書寫和印刷上使用不同的樣式。
- 對於標量,我們使用小寫字母來表示,如a,b, x, y, z, 0, a等。
- 對於向量,我們使用小寫的粗體字母來表示,如a,b, u,v等。
- 對於後面要學習的矩陣,我們使用大寫的粗體字母來表示,如A, B, S, M, R等。
在圖4.15中,一個向量通常由一個箭頭來表示。我們有時會講到一個向量的頭(head)和尾(tail)向量的頭指的是它的箭頭所在的端點處,而尾指的是另一個端點處,如圖4.15所示。
那麼一個向量要放在哪裡呢?從向量的定義來看,它只有模和方向兩個屬性,並沒有位置資訊。這聽起來很難理解,但實際上在生活中我們總是會和這樣的向量打交道。例如,當我們講到一個物體的速度時,可能會這樣說“那個小偷正在以100km/h的速度向南逃竄”(快抓住他!),這裡的“以100km/h的速度向南”就可以使用一個向量來表示。通常,向量被用於表示相對於某個點的偏移(displacement),也就是說它是一個相對量。只要向量的模和方向保持不變,無論放在哪裡,都是同一個向量。
點和向量的區別
回顧一下,點是一個沒有大小之分的空間中的位置,而向量是一個有模和方向但沒有位置的量。從這裡看,點和向量具有不同的意義。但是,從表示方式上兩者非常相似。
在上一節中我們提到,向量通常用於描述偏移量,因此,它們可以用於描述相對位置,即相對於另一個點的位置,此時向量的尾是一個位置,那麼向量的頭就可以表示另一個位置了。而一個點可以用於指定空間中的一個位置(即相對於原點的位置)。如果我們把向量的尾固定在座標系原點,那麼這個向量的表示就和點的表示重合了。圖4.16表示了兩者之間的關係。
儘管上面的內容看起來顯而易見,但區分點和向量之間的不同是非常重要的,儘管它們在數學表示式上是一樣的,都是一串數字而已。如果一定要給它們之間建立一個聯絡的話,我們可以認為,任何一個點都町以表示成一個從原點出發的向量。為了明確點和向量的區別,在本書後面的內容中,我們將用於表示方向的向量稱為方向向量。
向量
向量是具有大小(模) 和方向的有向線段;
向量沒有位置,只有大小與方向;
向量是從尾指向箭頭的,尾部是它的開端,箭頭是它的終點;
向量的表示,幾維就是()裡有幾個數字,如二維向量(2,4),三維向量(1,2,3);
向量通常用於表示相對於某個點的偏移;
我們通常用加粗的小寫字母表示向量如a,b,c,d
標量
標量只有大小(模),沒有方向;
我們通常使用普通的小寫字母來表示標量如a,b,c,d
點
點是n維空間內的一個位置,無大小和方向;
點和向量雖然都是()表示,但幾何意義完全不同;
零向量
零向量是唯一大小為零的向量
零向量是唯一一個沒有方向的量
零向量不是一個點,因為沒有定義某個位置
零向量便是沒有位移,就像零標量表示的沒有數量一樣
向量與點
向量和點數學形式上相等,幾何意義完全不同
點:有位置沒有實際大小和方向
向量:無位置,有實際大小和方向
聯絡:任何一個點都可以看做是從原點出發的向量
向量的運算
在下面的內容裡,我們將給出一些最常見的向量運算。幸運的是,這些運算大多很好理解。對於每種運算,我們會先給出數學上的描述,然後再給出幾何意義上的解釋。
向量和標量的乘法/除法
還記得嗎?標量是隻有模沒有方向的量,雖然我們不能把向量和標量進行相加/相減的運算(想象一下,你會把速度和距離相加嗎),但可以對它們進行乘法運算,結果會得到一個不同長度且可能方向相反的新的向量。
公式非常簡單,我們只需要把向量的每個分量和標量相乘即可:
類似的,一個向量也可以被一個非零的標量除。這等同於和這個標量的倒數相乘:
下面給出一些例子:
注意,對於乘法來說,向量和標量的位置可以互換。但對於除法,只能是向量被標量除,而不能是標量被向量除,這是沒有意義的。
從幾何意義上看,把一個向量v和一個標量k相乘,意味著對向量v進行一個大小為|k|句的縮放。例如,如果想要把一個向量放大兩倍,就可以乘以2。當k<0時,向量的方向也會取反。圖4.17顯示了這樣的一些例子。
向量的加法和減法
我們可以對兩個向量進行相加或相減,其結果是一個相同維度的新向量。
我們只需要把兩個向量的對應分量進行相加或相減即可。公式如下:
下面是一些例子:
(1,2,3)+(4,5,6)=(5,7,9)
(5,2,7)-(3,8,4)=(2,-6,3)
需要注意的是,一個向量不可以和一個標量相加或相減,或者是和不同維度的向量進行運算。從幾何意義上來看,對於加法,我們可以把向量a的頭連線到向量b的尾,然後畫一條從a的尾到b的頭的向量,來得到a和b相加後的向量。也就是說,如果我們從一個起點開始進行了—個位置偏移a,然後又進行一個位置偏移b,那麼就等同於進行了一個a+b的位置偏移。這被稱為向量加法的三角形定則(triangle rule)向量的減法是類似的,如圖4.18所示。
需要時刻謹記,在圖形學中向量通常用於描述位置偏移(簡稱位移)。因此,我們可以利用向量的加法和減法來計算一點相對於另一點的位移。
假設,空間內有兩點a和b還記得嗎,我們可以用向量a和b來表示它們相對於原點的位移。如果我們想要計算b相對於點a的位移,就可以通過把b和a相減得到,如圖4.19所示
向量的模
正如我們之前講到的一樣,向量是有模和方向的。向量的模是一個標量,可以理解為是向量在空間中的長度。它的表示符號通常是在向量兩旁分別加上一條垂直線(有的文獻中會使用兩條垂直線)。三維向量的模的計算公式如下:
其他維度的向量的模計算類似,都是對每個分量的平方相加後再開根號得到。下面給出一些例子:
其他維度的向量的模計算類似,都是對每個分量的平方相加後再開根號得到。下面給出一些例子:
我們可以從幾何意義來理解上述公式。對於二維向量來說,我們可以對任意向量構建一個三角形,如圖4.20所示。
從圖4.20可以看出,對於二維向量,其實就是使用了勾股定理,向量的兩個分量的絕對值對應了三角形兩個直角邊的長度,而斜邊的長度就是向量的模。
單位向量(標準化向量)
在很多情況下,我們只關心向量的方向而不是模。例如,在計算光照模型時,我們往往需要得到頂點的法線方向和光源方向,此時我們不關心這些向量有多長。在這些情況下,我們就需要計算單位向量(unit vector)。
單位向量指的是那些模為1的向量。單位向量也被稱為被歸一化的向量(normalized vector).,對任何給定的非零向量,把它轉換成單位向量的過程就被稱為歸一化(normalization)。
給定任意非零向量V,我們可以計算和v方向相同的單位向量。在本書中,我們通過在一個向量的頭上新增一個戴帽符號來表示單位向量,例如為了對向量進行歸一化,我們可以用向量的模除以該向量來得到,公式如下:
下面給出一些例子
零向量(即向量的每個分量值都為0,如v=(0,0,0))是不可以被歸一化的。這是因為做除法運算時分母不能為0。
從幾何意義上看,對二維空間來說,我們可以畫一個單位圓,那麼單位向量就可以是從圓心出發、到圓邊界的向量。在三維空間中,單位向量就是從一個單位球的球心出發、到達球面的向量。圖4.21給出了二維空間內的一些單位向量。
需要注意的是,在後面的章節中我們將會不斷遇到法線方向(也被稱為法向量)、光源方向等,這些向量不一定是歸一化後的向量。由於我們的計算往往要求向量是單位向量,因此在使用前應先對這些向量進行歸一化運算。
向量的點積
↑圖片:【技術美術百人計劃】圖形 1.2.1 向量基礎
向量之間也可以進行乘法,但是和標量之間的乘法有很大不同。向量的乘法有兩種最常用的
種類:點積(dot product,也被稱為內積,inner product)和叉積(cross product,也被稱為外積,outer product)在本節中,
我們將討論第一種型別:點積。
讀者可能認為上面幾節的內容都很簡單,“這些都顯而易見嘛”。那麼從這一節開始,我們就會遇到一些真正需要花費力氣(真的只要一點點)去記憶的公式。幸運的是,絕大多數公式是有幾何意義的,也就是說,我們可以通過畫圖的方式來理解和幫助記憶。
比僅僅記住這些公式更加重要的是,我們要真正理解它們是做什麼的。只有這樣,我們才能在需要時想起來,“噢,這個需求我可以用這個公式來實現!”在我們編寫Shader的過程中,通常程式介面都會提供這些公式的實現,因此我們往往不需要手工輸入這些公式。例如,在Unity Shader中,我們可以直接使用形如dot(a,b)的程式碼來對兩個向量值進行點積的運算。
點積的名稱來源於這個運算的符號:a·b中間的這個圓點符號是不可以省略的。點積的公式有兩種形式,我們先來看第一種。兩個三維向量的點積是把兩個向量對應分量相乘後再取和,最後的結果是一個標量。
下面是一些例子
向量的點積滿足交換律,即a·b=b·a
點積的幾何意義很重要,因為點積幾乎應用到了圖形學的各個方面。其中一個幾何意義就是投影(projection)
↑圖片:【技術美術百人計劃】圖形 1.2.1 向量基礎
也就是說,點積的符號可以讓我們知道兩個向量的方向關係。
那麼,如果 不是一個單位向量會如何呢?這很容易想到,任何兩個向量的點積a·b等同於b在a方向上的投影值,再乘以a的長度。
點積具有一些很重要的性質,在Shader的計算中,我們會經常利用這些性質來幫助計算。
性質一:點積可結合標量乘法。
上面的“結合”是說,點積的運算元之一可以是另一個運算的結果,即向量和標量相乘的結果。公式如下:
也就是說,對點積中其中一個向量進行縮放的結果,相當於對最後的點積結果進行縮放。
性質二:點積可結合向量加法和減法,和性質一類似。
這裡的“結合”指的是,點積的運算元可以是向量相加或相減後的結果。用公式表達就是
把上面的c換成-c就可以得到減法的版本。
性質三:一個向量和本身進行點積的結果,是該向量的模的平方。
這點可以很容易從公式驗證得到:
這意味著,我們可以直接利用點積來求向量的模,而不需要使用模的計算公式。當然,我們需要對點積結果進行開平方的操作來得到真正的模。但很多情況下,我們只是想要比較兩個向量的長度大小,因此可以直接使用點積的結果。畢竟,開平方的運算需要消耗一定效能。
現在是時候來看點積的另一種表示方法了。這種方法是從三角代數的角度出發的,這種表示方法更加具有幾何意義,因為它可以明確地強調出兩個向量之間的角度。
我們先直接給出第二個公式。
公式二:
向量的叉積
↑【技術美術百人計劃】圖形 1.2.1 向量基礎
另一個重要的向量運算就是叉積(cross product),也被稱為外積(outer product)o與點積不同的是,向量叉積的結果仍是一個向量,而非標量。
和點積類似,叉積的名稱來源於它的符號:axb同樣,這個叉號也是不可省略的。兩個向量的叉積可以用如下公式計算:
上面的公式看起來很複雜,但其實是有一定規律的。圖4.25給出了這樣的規律圖示。
需要注意的是,叉積不滿足交換律,即axb≠bxa。實際上,叉積是滿足反交換律的,即axb=-(bxa)而且叉積也不滿足結合律,即(aXb) xc≠ax(bxc)。
從叉積的幾何意義出發,我們可以更加深入地理解它的用處。對兩個向量進行叉積的結果會得到一個同時垂直於這兩個向量的新向量。我們已經知道,向量是由一個模和方向來定義的,那麼這個新的向量的模和方向是什麼呢?
我們先來看它的模。axb的長度等於a和b的模的乘積再乘以它們之間夾角的正弦值。公式如下:
上述公式和點積的計算公式很類似,不同的是,這裡使用的是正弦值。如果讀者對中學數學還有記憶的話,可能還會發現,這和平行四邊形的面積計算公式是一樣的。如果你忘記了,沒關係,我們在這裡回憶一下。
如圖4.26所示,我們使用a和b構建一個平行四邊形。
我們知道,平行四邊形的面積可以使用|b|/h來得到,即底乘以高。而又可以使用|a|和夾角 來得到,即
你可能會問,如果a和b平行(可以是方向完全相同,也可以是完全相反)怎麼辦,不就不能構建平行四邊形了嗎?我們可以認為構建出來的平行四邊形面積為0,那麼axb=0 注意,這裡得到的是零向量,而不是標量0。
下面,我們來看結果向量的方向。你可能會說:“方向?不是己經說了方向了嘛,就是和兩個向量都垂直就可以了啊。”但是,如果你仔細想一下就會發現,實際上我們有兩個方向可以選擇,這兩個方向都和這兩個向量垂直。那麼,我們要選擇哪個方向呢?
這裡就要和之前提到的左手座標系和右手座標系聯絡起來了,如圖4.27所示。
這個結果是怎麼得到的呢?來,舉起你的雙手!哦,不……先舉起你的右手。在右手座標系中,axb的方向將使用右手法則來判斷。我們先想象把手心放在了 a和b的尾部交點處,然後張開你的手掌讓手掌方向和a的方向重合,再彎曲你的四指讓它們向b的方向靠攏,最後伸出你的大拇指!大拇指指向的方向就是右手座標系中axb的方向了。如果你實在不明白怎麼擺放和扭動你的手,那麼就看圖4.28好了。
同理,我們可以使用左手法則來判斷左手座標系中axb的方向。趕緊舉起你的左手試試吧(你可能會發現這個姿勢比較扭曲)!
需要注意的是,雖然看起來左右手座標系的選擇會影響叉積的結果,但這僅僅是“看起來”而己。從叉積的數學表示式可以發現,使用左手座標系還是右手座標系不會對計算結果產生任何影響,它影響的只是數字在三維空間中的視覺化表現而己。當從右手座標系轉換為左手座標系時,所有點和向量的表達和計算方式都會保持不變,只是當呈現到螢幕上時,我們可能會發現,“咦,怎麼影像反過來了!”。當我們想要兩個座標系達到同樣的視覺效果時,可能就需要改變一些數學運算公式
複習總結:截圖來源
B站【技術美術百人計劃】圖形 1.2.1 向量基礎
相關閱讀:
「技美之路 第01篇」圖形 1.1 渲染流水線
文獻地址:感謝作者無私分享
CSDN:古守音
https://blog.csdn.net/qq_43210334/article/details/114646000
參考《Shader入門精要》·馮樂樂女神著
B站視訊 “技術美術百人計劃”·霜狼_may
來源:Game藝視界
原文:https://mp.weixin.qq.com/s/UmuJO976HxvrzkOzpsqLjw
相關文章
- 「技美之路 第07篇」圖形 2.2 模型與材質基礎模型
- 「技美之路 第04篇」圖形 1.2.3 MVP矩陣運算MVP矩陣
- 「技美之路 第08篇」圖形 2.4 傳統經驗光照模型詳解模型
- 第12周-Microwave皮膚圖形介面基礎
- Illustrator 2022向量圖形工具
- SVG 基礎圖形SVG
- Illustrator 2022 向量圖形軟體
- 幾何圖形構成的向量化極簡風格美術
- 前端資料之美 -- 基礎篇前端
- cdr2021 向量圖形設計工具
- 向量圖形設計Illustrator 2022(AI)AI
- 圖形學基礎知識
- 前端之路---入坑篇之基礎中的基礎html前端HTML
- 「Golang成長之路」基礎語法篇Golang
- Shader 繪製基礎圖形
- AI 2022 向量圖形軟體 最新版AI
- PatterNodes Mac(建立圖形向量模式工具)Mac模式
- 向量圖形編輯控制元件控制元件
- 【matplotlib基礎】--3D圖形3D
- OpenGL基礎圖形程式設計(四)基礎程式結構程式設計
- 機器學習基礎篇:支援向量機(SVM)理論與實踐機器學習
- 前端之路---入坑篇之JavaScript基礎筆記前端JavaScript筆記
- Web Audio API 第1章 基礎篇WebAPI
- JavaScript基礎第02天筆記JavaScript筆記
- WPF基礎:在Canvas上繪製圖形Canvas
- OpenGL基礎圖形程式設計(一)OpenGL與3D圖形世界程式設計3D
- Rhino基礎操作3 - 出圖篇
- JavaGUI——繪圖技術基礎JavaGUI繪圖
- Boxy SVG for Mac - 向量圖形編輯器SVGMac
- HT全向量化的圖形元件設計元件
- Re:從零開始的Linux之路(基礎篇)Linux
- Java核心基礎第3篇-Java流程控制Java
- CorelDRAW Graphics Suite 2023 向量圖形設計工具 最新啟用UI
- Java圖形設計和多媒體基礎Java
- Windows程式設計系列:圖形程式設計基礎Windows程式設計
- 【Android繪圖】繪圖之基礎篇(一)Android繪圖
- swift小結02-基礎篇Swift
- 領先的向量圖形軟體Ai2023(Illustrator 2023)AI