UnityAPI.Vector3三维向量

表示3D的向量和点。

这个结构用于在Unity传递3D位置和方向。它也包含做些普通向量运算的函数。

除了下面列出的函数,其他类用于处理向量和点。例如Quaternion和Matrix4x4类用于旋转或变换向量和点。

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实例的单位向量,即返回向量的方向与原方向相同,而模长变为1。

此属性和实例方法Normalized( )的区别:

设A、C均为Vector3实例,则:

执行代码C=A.normalized后只是将向量A的单位向量赋给向量C,而向量A自身未变

执行代码A=Normalize()便会将向量A进行单位化处理,使得原向量A变成了单位向量

执行代码C=Vector3.Normalize(A)的结果与执行代码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进行放缩,注意与静态方法Scale(a:Vector3,b:Vector3)的区别:

实例方法直接更改实例的值,静态方法将值赋给新的实例


C、Vector3类静态方法

1、Angle:求两个向量夹角

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

返回向量from和to的夹角,单位为角度,返回值的范围为[0,180],且当from和to至少一个为Vector.zero时,返回值为90


2、ClampMagnitude:向量长度

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

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

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

当maxLength大于vector的模长时,返回向量与vector相同

当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的方向旋转,大拇指指向的方向是c的方向


4、Dot:向量点乘

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

此方法用于返回参数lhs和rhs的点乘

c=Vector3.Dot( a,b );

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

在实际开发中,通常利用点乘来确定两个物体的相对位置关系,例如敌人相对主角的位置关系


5、Lerp:向量插值

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

此方法用于返回一个参数from到to的线性插值向量

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

当t<=0时,向量C=A;

当t>=1时,向量C=B;

当0


6、MoveTowards:向量插值

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

此方法用于返回一个从参数current到参数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:两个坐标轴的正交化

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

此方法用于对向量normal进行单位化处理,并对向量tangent进行正交化处理

Vector3.OrthoNormalize(ref v1, ref v2);

v1、v2变换为v3、v4

v3=v1.normalized

v4与v3垂直,且v4模长为1


8、OrthoNormalize:3个坐标轴的正交化

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

此方法用于对向量normal进行单位化处理,并对向量tangent和binormal进行正交化处理

向量binormal垂直于向量normal和tangent组成的平面,且向量binormal变换前后的夹角小于90度,即执行OrthoNormalize之后,bi'normal的方向可能垂直于由normal和tangent组成的平面的正面也可能是负面,到底垂直于哪个面由初始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);

其中,参数inDirection为入射向量,参数inNormal为镜面向量

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

参数inNormal向量必须为单位向量,否则入射角和反射角不相等

当inNormal取反时,反射向量不受影响

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


11、RotateTowards:球形插值

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

float maxMagnitudeDelta);

其中参数current到target的球形旋转插值向量,此方法可控制插值向量的角度和模长


12、Scale:向量放缩

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

此方法用于返回向量a和b的乘积,注意和实例方法a.Scale(b)的区别


13、Slerp:球形插值

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

此方法用于返回参数from点到参数to点的球形插值向量,参数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为起始坐标,target为终点坐标,currentVelocity为当前帧移动向量,参数smoothTime为接近目标的阻尼强度,

参数maxSpeed为最大移动速度,默认值为无穷大,参数deltaTime为控制当前帧实际移动距离,即为maxSpeed*deltaTime,

默认值为Time.deltaTime

此方法用于模拟GameObject对象从current点到target点之间的阻尼运动


D、Vector3类运算符

1、operator==

用于判断向量是否足够接近或相等


经验总结:

控制游戏对象向目标点移动有三种方法:

(1)、用Lerp方法(插值函数):

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方法控制游戏对象向目标点移动,其是按比例进行移动的,只能无限接近,不能到达目标位置点。

用MoveTowards方法控制游戏对象向目标点移动,每次移动一个设定的步长,其可以到达目标位置点。


用Distance和Translate方法控制游戏对象向目标点移动,有很大的局限性,其必须先要知道要移动的方向才可以,况且只能是正方向,并且其也只能接近,不能到达目标点位置。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容