日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

「技美之路」图形 1.2.1 向量基础

發布時間:2024/8/26 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 「技美之路」图形 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 向量基礎
?

總結

以上是生活随笔為你收集整理的「技美之路」图形 1.2.1 向量基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。