Unity中的向量(vector)

理論部分

1. 概念

  • 向量(vector):既有大小(magnitude )又有方向(direction)的量叫做向量梁棠。向量是物理惨缆、動畫、三維圖形的基礎(chǔ)嵌洼。
  • 標量(scalar):只有大小沒有方向的量赖捌。例如物體移動中的平均速率祝沸、路程。
  • magnitude : 向量的長度
  • 模:向量的長度標準化(Normalizing)越庇,即保持方向不變罩锐,將向量的長度變?yōu)?。

Although vector operations are easy to describe, they are surprisingly subtle and powerful and have many uses in games programming. Vector arithmetic is fundamental to 3D graphics, physics and animation and it is useful to understand it in depth to get the most out of Unity

  • 如果我們定義一個vector3(2.5,2)卤唉,這意味這什么呢涩惑?在Unity中,所有的向量都是從世界坐標零點開始桑驱。因此這個向量表示從vector.zero發(fā)出的一條線竭恬,到(2,5熬的,2)這個地方停止痊硕。由于這條直線都是從vector.zero發(fā)出,因此我們可以把它看成是一個三維世界中的點押框。
    magnitude計算:Vector3.magnitude

2. 向量運算

  • 向量加法:


    When two vectors are added together, the result is equivalent to taking the original vectors as “steps”, one after the other. Note that the order of the two parameters doesn’t matter, since the result is the same either way.

    如果我們把第一個vector看作是一個點岔绸,那相加的結(jié)果就是從第一個點開始,“跳躍”另一個加數(shù)后的結(jié)果。比如上面的圖中盒揉,C可以看作是a向右跳了2晋被,又向下跳了1的結(jié)果。如果我們想計算一個物體離地面的距離刚盈,我們可以這樣寫:

var pointInAir = pointOnGround + new Vector3(0, 5, 0);
  • 向量減法:


    Vector subtraction is most often used to get the direction and distance from one object to another. Note that the order of the two parameters does matter with subtraction:-

    向量減法常用于取得一個對象到另一個對象之間的方向和距離墨微。注意減法式子中的參數(shù)順序會影響到結(jié)果。


    image.png
  • 標量乘/除(scalar):
  • Multiplying a vector by a scalar results in a vector that points in the same direction as the original. However, the new vector’s magnitude is equal to the original magnitude multiplied by the scalar value.
  • Likewise, scalar division divides the original vector’s magnitude by the scalar.
  • When any vector is divided by its own magnitude, the result is a vector with a magnitude of 1, which is known as a normalized vector.(標準化向量)扁掸。If a normalized vector is multiplied by a scalar then the magnitude of the result will be equal to that scalar value. This is useful when the direction of a force is constant but the strength is controllable (eg, the force from a car’s wheel always pushes forwards but the power is controlled by the driver).
  • scalar的結(jié)果始終是:方向不變,長度(magnitude)改變最域;當一個向量被自身的magnitude除以后谴分,始終得到magnitude=1的向量,這就叫做向量的標準化(Normalizing)模镀脂。標準化后的向量再次scalar后牺蹄,這個向量的magnitude就等于scalar。
  • 點乘(Dot Product):
    The dot product takes two vectors and returns a scalar. This scalar is equal to the magnitudes of the two vectors multiplied together and the result multiplied by the cosine of the angle between the vectors.

    點乘就是兩個向量相乘薄翅,點乘的結(jié)果始終是一個標量(scalar)沙兰;等于兩個vector的長度相乘再乘以兩個向量夾角的余弦。
    如果兩個向量都是標準化向量翘魄,那么a·b等于向量b在向量a方向上的投影的長度(或者說向量a在向量b方向上的投影)鼎天。,兩個向量的前后次序并不重要
常見角度的余弦值

點乘可以用來方便的判斷兩個向量是否彼此垂直暑竟,點乘結(jié)果為0時兩者垂直

The dot product is a very simple operation that can be used in place of the Mathf.Cos function or the vector magnitude operation in some circumstances (it doesn’t do exactly the same thing but sometimes the effect is equivalent). However, calculating the dot product function takes much less CPU time and so it can be a valuable optimization.
點乘運算可以極大的節(jié)省CPU資源斋射。

  • 叉乘(Cross Product)a ^ b:

    • 只適用于三維空間,計算兩個向量但荤,返回一個新的向量罗岖。新向量的方向和前兩個向量垂直。


      左手定理
    • 叉乘的運算公式:向量a和b的長度相乘腹躁,再乘以它們夾角的正弦值


      image.png

      叉乘的表示
  • 一個顯而易見的用途就是叉乘可以用來計算法線

3. 兩個物體之間的距離和方向

兩個向量a,b相減(a-b)的結(jié)果是得到一個新向量桑包,從b指向a;反之亦然

var heading = target.position - player.position; // 1

1.得到player指向target的向量

var distance = heading.magnitude;// 2
var direction = heading / distance; // 3
  1. 得到這個向量的長度
  2. 所以纺非,player向著目標點的方向就是長度/距離(Normalized magnitude)
    我們這樣計算的目的是為了同時獲得新向量的長度和標準化后的向量以便于下一步計算哑了。這兩個數(shù)值的計算都是cpu heavy的。因為他們的計算都需要開平方铐炫。
if (heading.sqrMagnitude < maxRange * maxRange) {
    // Target is within range.
}
  1. 有時我們只想知道方向垒手,而不想知道player距離target有多遠,為了避免計算magnitude倒信,我們可以使用sqrMagnitude方法計算magnitude的平方科贬,這樣可以避免開方運算,節(jié)省cpu資源。This is much more efficient than using the true magnitude in the comparison.

4. 計算垂直vector

image.png

當給定空間中的3個點后榜掌,我們只需要從任意一個點出發(fā)优妙,得到它到另外兩個點的向量,然后對這兩個向量做叉乘即可:

var a: Vector3;
var b: Vector3;
var c: Vector3;

var side1: Vector3 = b - a;
var side2: Vector3 = c - a;
var perp: Vector3 = Vector3.Cross(side1, side2);

那么這個新向量的長度是多少呢憎账?它應該等于三角形的面積×2


image.png

5.使用點乘

想象一輛車的碼表套硼,其速度計算依賴于車輪胎前進的方向,但是車子在某些情況下也有側(cè)滑等情況出現(xiàn)胞皱,這時邪意,碼表計算時就應該把側(cè)滑的速度也計算進去。我們可以通過rigidbody.velocist得到車子總體的位移情況反砌,但為了將其投影到前向雾鬼,我們可以使用點乘:

 var fwdSpeed = Vector3.Dot(rigidbody.velocity, transform.forward);

【參考文獻】

  1. unity官方手冊:Vector Cooknook
  2. Vector Maths - Unity Official Tutorials
  3. https://www.youtube.com/watch?v=wXI9_olSrqo&t=44s
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宴树,隨后出現(xiàn)的幾起案子策菜,更是在濱河造成了極大的恐慌,老刑警劉巖酒贬,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件又憨,死亡現(xiàn)場離奇詭異,居然都是意外死亡锭吨,警方通過查閱死者的電腦和手機蠢莺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來零如,“玉大人浪秘,你說我怎么就攤上這事〔嚎觯” “怎么了耸携?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辕翰。 經(jīng)常有香客問我夺衍,道長,這世上最難降的妖魔是什么喜命? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任沟沙,我火速辦了婚禮,結(jié)果婚禮上壁榕,老公的妹妹穿的比我還像新娘矛紫。我一直安慰自己,他們只是感情好牌里,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布颊咬。 她就那樣靜靜地躺著务甥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喳篇。 梳的紋絲不亂的頭發(fā)上敞临,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音麸澜,去河邊找鬼挺尿。 笑死,一個胖子當著我的面吹牛炊邦,可吹牛的內(nèi)容都是我干的编矾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼馁害,長吁一口氣:“原來是場噩夢啊……” “哼洽沟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜗细,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怒详,沒想到半個月后炉媒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡昆烁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年吊骤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片静尼。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡白粉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼠渺,到底是詐尸還是另有隱情鸭巴,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布拦盹,位于F島的核電站鹃祖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏普舆。R本人自食惡果不足惜恬口,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沼侣。 院中可真熱鬧祖能,春花似錦、人聲如沸蛾洛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揭厚,卻和暖如春却特,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筛圆。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工裂明, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人太援。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓闽晦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親提岔。 傳聞我的和親對象是個殘疾皇子仙蛉,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容