UnityAPI.Vector3三維向量

表示3D的向量和點檩奠。

這個結(jié)構(gòu)用于在Unity傳遞3D位置和方向。它也包含做些普通向量運算的函數(shù)附帽。

除了下面列出的函數(shù)埠戳,其他類用于處理向量和點。例如Quaternion和Matrix4x4類用于旋轉(zhuǎn)或變換向量和點士葫。

1乞而、Vector3.this[int] 操作索引

使用[0], [1], [2]分別訪問組件x, y, z組件送悔。簡單來說就是用索引號代替x, y, z組件慢显。

using UnityEngine;

using System.Collections;

public class ExampleClass : MonoBehaviour {

? ? public Vector3 p;

? ? void Example() {

? ? ? ? p[1] = 5;

? ? }

}


API詳解


A爪模、Vector3類實例屬性

1、normalized:單位化向量

public Vector3 normalized{ get; }

此屬性用來獲取Vector3實例的單位向量荚藻,即返回向量的方向與原方向相同屋灌,而模長變?yōu)?。

此屬性和實例方法Normalized( )的區(qū)別:

設(shè)A应狱、C均為Vector3實例共郭,則:

執(zhí)行代碼C=A.normalized后只是將向量A的單位向量賦給向量C,而向量A自身未變

執(zhí)行代碼A=Normalize()便會將向量A進(jìn)行單位化處理疾呻,使得原向量A變成了單位向量

執(zhí)行代碼C=Vector3.Normalize(A)的結(jié)果與執(zhí)行代碼C=A.normalized的相同除嘹,即只是將A的單位向量賦給了向量C,而向量A未被改變岸蜗,因此編程中常用代碼C=A.normalized代替尉咕。


2、sqrMagnitude:模長平方

public float sqrMagnitude{ get; }

此屬性用于返回Vector3實例模長的平方值璃岳,由于計算開方值比較消耗資源年缎,在非必要情況下,可以考慮用

sqrMagnitude代替屬性magnitude铃慷,例如比較兩個向量長度的大小


B单芜、Vector3類實例方法

1、Scale:向量放縮

public void Scale(Vector3 scale);

此方法可以對Vector3實例按參照向量scale進(jìn)行放縮犁柜,注意與靜態(tài)方法Scale(a:Vector3洲鸠,b:Vector3)的區(qū)別:

實例方法直接更改實例的值,靜態(tài)方法將值賦給新的實例


C馋缅、Vector3類靜態(tài)方法

1坛怪、Angle:求兩個向量夾角

public static float Angle(Vector3 from, Vector3 to );

返回向量from和to的夾角,單位為角度股囊,返回值的范圍為[0,180]袜匿,且當(dāng)from和to至少一個為Vector.zero時,返回值為90


2稚疹、ClampMagnitude:向量長度

public static Vector3 ClampMagnitude(Vector3 vector居灯,float maxLength);

此方法用于返回向量vector3的一個同方向向量,其模長受maxLength的限制

返回向量的方向和vector方向相同

當(dāng)maxLength大于vector的模長時内狗,返回向量與vector相同

當(dāng)maxLength小于vector的模長時怪嫌,返回向量的模長等于maxLength,但方向與vector相同


3柳沙、Cross方法:向量叉乘

public static Vector3 Cross(Vector3 lhs岩灭,Vector3 rhs);

此方法用于求兩個向量的叉乘,滿足:

c⊥a赂鲤,c⊥b噪径;

|c|=|a|*|b|sin(e);

a柱恤,b,c滿足右手法則找爱,即四指指向b的方向梗顺,然后向a的方向旋轉(zhuǎn),大拇指指向的方向是c的方向


4车摄、Dot:向量點乘

public static float Dot(Vector3 lhs, Vector3 rhs);

此方法用于返回參數(shù)lhs和rhs的點乘

c=Vector3.Dot( a,b );

c=|a|*|b|cos(e)

在實際開發(fā)中寺谤,通常利用點乘來確定兩個物體的相對位置關(guān)系,例如敵人相對主角的位置關(guān)系


5吮播、Lerp:向量插值

public static Vector3 Lerp(Vector3 from, Vector3 to, float t);

此方法用于返回一個參數(shù)from到to的線性插值向量

C=Vector3.Lerp(A变屁,B,t)

當(dāng)t<=0時意狠,向量C=A敞贡;

當(dāng)t>=1時,向量C=B摄职;

當(dāng)0


6誊役、MoveTowards:向量插值

public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);

此方法用于返回一個從參數(shù)current到參數(shù)target的插值向量。

C=Vector3.MoveTowards(A,B,sp);

向量C為:C=A+K*(B-A)

其中K=sp>(dx^2+dy^2+dz^2)^(1/2)?1:sp/(dx^2+dy^2+dz^2)^(1/2)


7谷市、OrthoNormalize:兩個坐標(biāo)軸的正交化

public static void OrthoNormalize(ref Vector3 normal, ref Vector3 tangent);

此方法用于對向量normal進(jìn)行單位化處理蛔垢,并對向量tangent進(jìn)行正交化處理

Vector3.OrthoNormalize(ref v1, ref v2);

v1、v2變換為v3迫悠、v4

v3=v1.normalized

v4與v3垂直鹏漆,且v4模長為1


8、OrthoNormalize:3個坐標(biāo)軸的正交化

public static void OrthoNormalize(ref Vector3 normal, ref Vector3 tangent创泄,ref Vecotor3 binormal );

此方法用于對向量normal進(jìn)行單位化處理艺玲,并對向量tangent和binormal進(jìn)行正交化處理

向量binormal垂直于向量normal和tangent組成的平面,且向量binormal變換前后的夾角小于90度鞠抑,即執(zhí)行OrthoNormalize之后饭聚,bi'normal的方向可能垂直于由normal和tangent組成的平面的正面也可能是負(fù)面,到底垂直于哪個面由初始binormal的方向決定


9搁拙、Project:投影向量

public static Vector3 Project(Vector3 vector秒梳,Vector3 onNormal);

此方法用于返回向量vector在向量onNormal上的投影向量

projects=Vector3.Project(from_T.position,to_T.position)箕速;

projects為from_T在to_T方向上的投影向量酪碘,另外,向量to_T無需為單位向量


10盐茎、Reflect:反射向量

public static Vector3 Reflect(Vector3 inDirection兴垦,Vector3 inNormal);

其中,參數(shù)inDirection為入射向量,參數(shù)inNormal為鏡面向量

此方法用于返回向量inDi'rection的反射向量

參數(shù)inNormal向量必須為單位向量探越,否則入射角和反射角不相等

當(dāng)inNormal取反時狡赐,反射向量不受影響

入射向量、反射向量和鏡面向量共面


11扶关、RotateTowards:球形插值

public static Vector3 RotateTowards(Vector3 ccurrent, Vector3 target, float maxRadiansDelta,

float maxMagnitudeDelta);

其中參數(shù)current到target的球形旋轉(zhuǎn)插值向量数冬,此方法可控制插值向量的角度和模長


12节槐、Scale:向量放縮

public static Vector3 Scale(Vector3 a, Vector3 b);

此方法用于返回向量a和b的乘積,注意和實例方法a.Scale(b)的區(qū)別


13拐纱、Slerp:球形插值

public static Vector3 Slerp(Vector3 from铜异,Vector3 to,float t);

此方法用于返回參數(shù)from點到參數(shù)to點的球形插值向量秸架,參數(shù)t范圍為[0,1]

C=Vector3.Slerp(from揍庄,to,t);

K=e*(1-t)

|C|=(ax^2+ay^2+az^2)^(1/2)+[(bx^2+by^2+bz^2)^(1/2)-(ax^2+ay^2-az^2)^(1/2)]*t


14东抹、SmoothDamp:阻尼移動

public static Vector3 SmoothDamp(Vector3 current蚂子,Vector3 target,ref Vector3 currentVelocity缭黔,

float smoothTime);

public static Vector3 SmoothDamp(Vector3 current食茎,Vector3 target,ref Vector3 currentVelocity馏谨,

float smoothTime别渔,float maxSpeed);

public static Vector3 SmoothDamp(Vector3 current,Vector3 target惧互,ref Vector3 currentVelocity哎媚,

float smoothTime,float maxSpeed喊儡,float deltaTime);

current為起始坐標(biāo)拨与,target為終點坐標(biāo),currentVelocity為當(dāng)前幀移動向量艾猜,參數(shù)smoothTime為接近目標(biāo)的阻尼強度截珍,

參數(shù)maxSpeed為最大移動速度,默認(rèn)值為無窮大箩朴,參數(shù)deltaTime為控制當(dāng)前幀實際移動距離岗喉,即為maxSpeed*deltaTime,

默認(rèn)值為Time.deltaTime

此方法用于模擬GameObject對象從current點到target點之間的阻尼運動


D炸庞、Vector3類運算符

1钱床、operator==

用于判斷向量是否足夠接近或相等


經(jīng)驗總結(jié):

控制游戲?qū)ο笙蚰繕?biāo)點移動有三種方法:

(1)、用Lerp方法(插值函數(shù)):

this.gameObject.transform.position=Vector3.Lerp(this.gameObject.transform.position,target.transform.position,speed);

(2)埠居、用MoveTowards方法

this.gameObject.transform.position=Vector3.MoveTowards(this.gameObject.transform.position,?target.transform.position,speed);

(3)查牌、用Distance和Translate方法

if(Vector3.Distance(this.gameObject.transform.position,target.transform.position)>0.1)

? ?{

??????this.gameObject.transform.Translate(target.transform.up);

}

三者之間的不同點:

用Lerp方法控制游戲?qū)ο笙蚰繕?biāo)點移動事期,其是按比例進(jìn)行移動的,只能無限接近纸颜,不能到達(dá)目標(biāo)位置點兽泣。

用MoveTowards方法控制游戲?qū)ο笙蚰繕?biāo)點移動,每次移動一個設(shè)定的步長胁孙,其可以到達(dá)目標(biāo)位置點唠倦。


用Distance和Translate方法控制游戲?qū)ο笙蚰繕?biāo)點移動,有很大的局限性涮较,其必須先要知道要移動的方向才可以稠鼻,況且只能是正方向,并且其也只能接近狂票,不能到達(dá)目標(biāo)點位置候齿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闺属,隨后出現(xiàn)的幾起案子慌盯,更是在濱河造成了極大的恐慌,老刑警劉巖掂器,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件润匙,死亡現(xiàn)場離奇詭異,居然都是意外死亡唉匾,警方通過查閱死者的電腦和手機孕讳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巍膘,“玉大人厂财,你說我怎么就攤上這事∠啃福” “怎么了璃饱?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肪康。 經(jīng)常有香客問我荚恶,道長,這世上最難降的妖魔是什么磷支? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任谒撼,我火速辦了婚禮,結(jié)果婚禮上雾狈,老公的妹妹穿的比我還像新娘廓潜。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布辩蛋。 她就那樣靜靜地躺著呻畸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悼院。 梳的紋絲不亂的頭發(fā)上伤为,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音据途,去河邊找鬼绞愚。 笑死,一個胖子當(dāng)著我的面吹牛昨凡,可吹牛的內(nèi)容都是我干的爽醋。 我是一名探鬼主播蚁署,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼便脊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了光戈?” 一聲冷哼從身側(cè)響起哪痰,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎久妆,沒想到半個月后晌杰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡筷弦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年肋演,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烂琴。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡爹殊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奸绷,到底是詐尸還是另有隱情梗夸,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布号醉,位于F島的核電站反症,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畔派。R本人自食惡果不足惜铅碍,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望线椰。 院中可真熱鬧该酗,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爵嗅,卻和暖如春娇澎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睹晒。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工趟庄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伪很。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓戚啥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锉试。 傳聞我的和親對象是個殘疾皇子猫十,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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