向量的计算和基本方法

来源:互联网 发布:路由器绑定mac 编辑:程序博客网 时间:2024/06/08 18:09

通过typeof获取游戏对象的某个独特属性(对象),并且通过FindObjectsOfType来寻找这个对象
Type t = typeof(CapsuleCollider);
CapsuleCollider[] objs = FindObjectsOfType();
建GameObject数组,并将场景中的对象拖拽到对象槽中:做一个数组字段,就可以使Unity之中获得对象槽。
向量:
模:向量的长度标准化(Normalizing):保持方向不变,将向量的长度变为1.
单位向量:长度为1的向量。
零向量:各分量均为0的向量
Z轴前进1:Vector3.forward
X轴前进1:Vector3.right
Y轴前进1:Vector3.up
0向量:Vector3.zero
创建一个向量
Vector3 v1 = new Vector3(2, 2, 2);
Debug.Log(“向量的长度平方:” + v1.sqrMagnitude);
Debug.Log(“向量的长度:” + v1.magnitude);
在该向量的方向上一个单位向量
Debug.Log(v1.normalized);
为单位向量赋值可得到精准的x,y,z长度,而不是近似数;
Vector3 v2 = v1.normalized;
Debug.Log(“x:” + v2.x);
Debug.Log(“y:” + v2.y);
Debug.Log(“z:” + v2.z);
向量运算——加减:向量的加法(减法)为各个分量分别相加(相减)。
Vector3 result = v3 - v4;
向量运算——数乘:向量与一个标量相乘称为数乘。数乘可以对向量的长度进行缩放,如果标量大于0,那么向量的方向不变,若标量小于0,则向量的方向会变为反方向。
One向量(1,1,1)
Debug.Log(Vector3.one * 5);
向量的角度:
Vector3 v1 = new Vector3(0, 0, 2);
Vector3 v2 = new Vector3(2, 0, 0);
float degrees = Vector3.Angle(v2, v1);
返回向量的长度,最大不超过maxLength所指示的长度:
Vector3 v3 = Vector3.ClampMagnitude(v2, 2);
返回a和b之间的距离:
float distance = Vector3.Distance(v1, v2);
两个向量之间的线性插值:(下面例子就是说由V4和V2之间,分成4份[0.25],得出(6.5,0,0));
Vector3 v4 = new Vector3(8,0,0);
Debug.Log(“lerp:”+Vector3.Lerp(v4, v2, 0.25f));
当前的地点移向目标:
在void Update ()函数中运行(每帧开始的位置,要移动到的位置,每帧移动的最大距离)
player.transform.position = Vector3.MoveTowards(player.transform.position, end.transform.position,0.1f);
对象从一个坐标以弧线移动到另一个坐标的案例(Slerp在两个向量之间球形插值)
(Time.time为一个游戏激活就开始计时的变动时间)
Vector3 center = (start.transform.position + end.transform.position) / 2;
center -= new Vector3(0,1,0);(改变中心点,球一直围绕中心点转动)
Vector3 startCenter = start.transform.position - center;
Vector3 endCenter = end.transform.position - center;
player.transform.position = Vector3.Slerp(startCenter, endCenter, (Time.time - startTime) / 5);
player.transform.position += center;
向量运算——点乘:两个向量点乘得到一个标量,数值等于两个向量长度相乘再乘以两者夹角的余弦值。如果两个向量a,b均为单位向量,那么a.b等于向量b在向量a方向上的投影的长度(或者说向量a在向量b方向上的投影)。
a*b=|a||b|Cos(&),&是向量a和b之间的夹角;
a*b=b*a乘法交换律;
详细查看课件点乘差乘图片。
(Vector.Dot(v1,v2)向量v1v2的点乘)
下列案例可得两向量之间的夹角
Vector3 v1 = new Vector3(2,0,0);
Vector3 v2 = new Vector3(-2,0,2);
float dotValue = Vector3.Dot(v1, v2);
Debug.Log(“点乘的结果:” +dotValue);
float temp = dotValue / (v1.magnitude * v2.magnitude);
(求出弧度)
float aCosTemp = Mathf.Acos(temp);
(转化成角度)
float degrees = Mathf.Rad2Deg * aCosTemp;
Debug.Log(degrees);
向量运算——差乘:
(Vector3.Cross)
Vector3 v1 = new Vector3(1, 3, 5);
Vector3 v2 = new Vector3(4, 6, 3);
Vector3 ret = Vector3.Cross(v1,v2);
Debug.Log(ret);
差乘的算法(详细见点乘差乘图片)
v1×v2=y1z2-y2z1+z1x2-z2x1+x1y2-x2y1
obj1.transform.position(父类绝对坐标)
obj2.transform.position(子类绝对坐标)
obj1.transform.localPosition(父类相对坐标)
obj2.transform.localPosition(子类相对坐标)
旋转:(放入Update函数)
(使一个对象以某个轴在某个时间单位内转多少角度)
obj3.transform.Rotate(new Vector3(0,30,0)*Time.deltaTime);
四元数(Quaternion)
欧拉角(new Vector3(0,30,0))(eulerAngles将一个欧拉角转换为四元数)
Quaternion q = Quaternion.identity;(identity同一性旋转只读,默认为不旋转)
q.eulerAngles = new Vector3(0,30,0) ;
obj3.transform.rotation = q;
按钮案例(GUI界面)(Button创建一个单次按下按钮。用户点击按钮事件立即触发。)(Rect矩阵(X,Y,长,宽))(四元数的左乘)
if (GUI.Button(new Rect(20,20,100,80),”Q_X”))
{
Quaternion q = Quaternion.identity;
q.eulerAngles = new Vector3(30, 0, 0);
transform.rotation = q * transform.rotation;(四元数相乘q = t * p; 这是将一个点先进行t 操作旋转,然后进行p操作旋转.)
}
(第二种四元数乘向量)
Quaternion * Vector3,
p : Vector3
t : Quaternion
q : Vector3;
q = t * p; 这是将向量p 进性t 操作旋转;

原创粉丝点击