php網(wǎng)站開(kāi)發(fā)套模板步驟打開(kāi)百度首頁(yè)
文章目錄
- 點(diǎn)乘(Dot Product)
- 叉乘(Cross Product)
- 向量歸一化(Normalize)
- 其他作用
unity開(kāi)發(fā)中我們要計(jì)算角度,判斷位置,常用點(diǎn)乘、叉乘、歸一化等等,我們看看他們的使用案例
點(diǎn)乘(Dot Product)
在Unity中的Vector3類(lèi)提供了Dot()
方法來(lái)計(jì)算兩個(gè)向量的點(diǎn)乘。點(diǎn)乘的結(jié)果是一個(gè)標(biāo)量值,可以用于判斷兩個(gè)向量的方向關(guān)系或者計(jì)算投影長(zhǎng)度等。
Vector3 vectorA = new Vector3(1, 2, 3);
Vector3 vectorB = new Vector3(4, 5, 6);float dotProduct = Vector3.Dot(vectorA, vectorB);// 如果dotProduct > 0,表示vectorA和vectorB大致指向同一方向;
// 如果dotProduct < 0,表示vectorA和vectorB大致指向相反方向;
// 如果dotProduct = 0,表示vectorA和vectorB互相垂直。
叉乘(Cross Product)
Unity中的Vector3類(lèi)也提供了Cross()
方法來(lái)計(jì)算兩個(gè)三維向量的叉乘。叉乘結(jié)果是一個(gè)新的向量,其方向垂直于原兩個(gè)向量所在的平面,并遵循右手定則。
Vector3 vectorA = new Vector3(1, 0, 0); // 假設(shè)是X軸正方向
Vector3 vectorB = new Vector3(0, 1, 0); // 假設(shè)是Y軸正方向Vector3 crossProduct = Vector3.Cross(vectorA, vectorB); // 結(jié)果應(yīng)該是Z軸正方向的單位向量// 在Unity中,常利用叉乘來(lái)計(jì)算面法線(xiàn)、旋轉(zhuǎn)軸等信息。
向量歸一化(Normalize)
Normalize()
方法用于將一個(gè)非零向量轉(zhuǎn)換為單位向量,即模長(zhǎng)為1但方向保持不變的向量。這對(duì)于描述方向而不關(guān)心大小的場(chǎng)合非常有用,如光源、觀察方向、表面法線(xiàn)等。
Vector3 nonNormalizedVector = new Vector3(3, 4, 5); // 長(zhǎng)度不為1的向量Vector3 normalizedVector = Vector3.Normalize(nonNormalizedVector); // 此時(shí)normalizedVector的長(zhǎng)度為1// 在Unity中,例如我們想要獲取某個(gè)物體朝向的方向,而不關(guān)心其速度或力的大小時(shí),就會(huì)使用歸一化向量。
其他作用
當(dāng)然,向量的點(diǎn)乘、叉乘以及歸一化在Unity和其他游戲引擎或計(jì)算機(jī)圖形學(xué)領(lǐng)域中還有更多的應(yīng)用:
點(diǎn)乘(Dot Product):
- 計(jì)算角度:通過(guò)點(diǎn)乘可以求出兩個(gè)單位向量之間的夾角余弦值,進(jìn)而得到角度。例如,在計(jì)算物體與光源的照射角度時(shí)會(huì)用到。
float angleInRadians = Mathf.Acos(Vector3.Dot(normalizedVectorA, normalizedVectorB));
-
投影長(zhǎng)度:如果需要計(jì)算一個(gè)向量在另一個(gè)向量方向上的投影長(zhǎng)度,也可以使用點(diǎn)乘。
-
光照模型:在Phong光照模型中,點(diǎn)乘用于計(jì)算表面法線(xiàn)與光線(xiàn)方向的夾角影響漫反射光強(qiáng)。
叉乘(Cross Product):
-
平面法線(xiàn):在三維空間中,可以通過(guò)兩個(gè)不共線(xiàn)的向量進(jìn)行叉乘來(lái)獲取所在平面的法線(xiàn)向量。
-
旋轉(zhuǎn)軸:在旋轉(zhuǎn)操作中,確定一個(gè)旋轉(zhuǎn)軸通常需要通過(guò)兩個(gè)非平行的方向向量叉乘得到。
-
力矩計(jì)算:在物理學(xué)模擬中,計(jì)算力對(duì)物體產(chǎn)生的力矩需要用到叉乘,即力矢量和力臂(從轉(zhuǎn)動(dòng)軸到力的作用點(diǎn))的叉乘。
向量歸一化(Normalize):
-
方向處理:在許多情況下,我們只關(guān)心物體的朝向而不關(guān)心其速度或大小,這時(shí)將速度或加速度向量歸一化,就可以得到方向信息。
-
紋理坐標(biāo)生成:在某些高級(jí)渲染技術(shù)如環(huán)境映射中,通過(guò)歸一化的視線(xiàn)方向向量來(lái)查詢(xún)立方體貼圖等。
-
單位向量陣列構(gòu)建:在構(gòu)建球形或圓柱形的法線(xiàn)貼圖時(shí),需要?jiǎng)?chuàng)建一系列均勻分布的單位向量,這就要用到歸一化操作。
總結(jié)來(lái)說(shuō),在Unity開(kāi)發(fā)過(guò)程中,點(diǎn)乘、叉乘和歸一化是非?;厩覍?shí)用的操作,廣泛應(yīng)用于碰撞檢測(cè)、物理模擬、光照計(jì)算、相機(jī)控制等多個(gè)領(lǐng)域。
python推薦學(xué)習(xí)匯總連接:
50個(gè)開(kāi)發(fā)必備的Python經(jīng)典腳本(1-10)
50個(gè)開(kāi)發(fā)必備的Python經(jīng)典腳本(11-20)
50個(gè)開(kāi)發(fā)必備的Python經(jīng)典腳本(21-30)
50個(gè)開(kāi)發(fā)必備的Python經(jīng)典腳本(31-40)
50個(gè)開(kāi)發(fā)必備的Python經(jīng)典腳本(41-50)
————————————————
?最后我們放松一下眼睛