Unity-計(jì)算法向/垂直矢量
2021-01-14 23:17 作者:unity_某某師_高錦錦 | 我要投稿
在網(wǎng)格生成期間經(jīng)常需要法向矢量(即,垂直于平面的矢量),此外,法向矢量還可能用于路徑跟蹤和其他情況。在平面中給定三個點(diǎn)(比如網(wǎng)格三角形的角點(diǎn)),就很容易找到法線。選擇三個點(diǎn)中的任意一個點(diǎn),然后分別從其他兩個點(diǎn)減去這個點(diǎn),即可得到兩個矢量:

var a: Vector3;
var b: Vector3;
var c: Vector3;
var side1: Vector3 = b - a;
var side2: Vector3 = c - a;
這兩個矢量的差積將得出垂直于表面的第三矢量。使用“左手規(guī)則”可確定將這兩個矢量傳遞到叉積函數(shù)的順序。在表面上方從上往下看(法線將指向外部)時,第一個矢量應(yīng)順時針掃過第二個矢量:
var perp: Vector3 = Vector3.Cross(side1, side2);
如果輸入矢量的順序顛倒,結(jié)果將指向完全相反的方向。
對于網(wǎng)格,法向矢量也必須歸一化。可通過歸一化屬性來實(shí)現(xiàn)此目的,但是還有另一個偶爾有用的技巧。還可以將垂直矢量除以其大小,從而將其歸一化:
var perpLength = perp.magnitude;
perp /= perpLength;
事實(shí)證明,三角形的面積等于 perpLength / 2。如果需要得出整個網(wǎng)格的表面積,或者想要根據(jù)相對面積隨機(jī)選擇三角形,這會很有用。
標(biāo)簽: