陕西建设网站电子政务大厅,wordpress 安全防护,东莞服务好的营销型网站建设,购物网站单页模板向量的加减法本文就不再赘述了#xff0c;本文侧重介绍脚本中的向量写法 一、向量的数乘 定义#xff1a;k(x,y,z)(kx,ky,kz) 若向量长度为L#xff0c;k取1/L#xff0c;就恰好能让原向量长度变成1#xff0c;变成了单位向量#xff0c;这称为向量的标准化 。
由于长度…向量的加减法本文就不再赘述了本文侧重介绍脚本中的向量写法 一、向量的数乘 定义k(x,y,z)(kx,ky,kz) 若向量长度为Lk取1/L就恰好能让原向量长度变成1变成了单位向量这称为向量的标准化 。
由于长度为1的向量很适合表示方向因此经常会将向量标准化下面举几个例子:
Vector3 anew Vector3(2,1,0);
Vector3 naa/a.magnitude; //a.magnitude是a的长度术语叫做“a的模”
//以上写法等价于
Vector3 na2a.normalized;
//
Vector3 na3Vector3.Normalized(a);
//
Vector na4(1/a.magnitude)*a;
以上代码用到的向量的两个常用属性magnitude模和normalized标准化。
二、向量的点乘 定义a · b|a| · |b|cosα x1,y1,z1) · (x2,y2,z2)x1x2y1y2z1z2 物理意义投影距离
点乘的结果不再是向量而是一个数这点要注意一下。
点乘满足交换律因此ab谁先谁后都一样。
下面介绍相关脚本
Vector3 anew Vector3(2,1,0);
Vector3 bnew Vector3(3,0,0);
Vector3 dir_bb.normalized;
float paVector3.dot(a,dir_b);//dot是点乘函数 三、向量的叉乘 定义|a × b||a||b|sinα 与点乘不同叉乘结果是一个新的向量方向垂直于原来两个向量构成的平面具体结果用左手定则判断用左手还是右手与坐标系有关。
左手定则手掌沿第一个向量放平向第二个向量我全拇指的指向即叉乘方向。如下图 叉乘不满足交换律若交换则叉乘方向变相反。即a×b-b×a
叉乘在游戏开发中的一个重要用途求法线。
在游戏开发中平面要区分正反两面因此法线用向量表示法线方向就是平面方向。一般发现长度固定为1以便计算。
用叉乘可以很方便地获取法线。例如玩家站在地形的一个平面上想要获取平面的法线需要先用启发方法获得平面上的任意两个向量只要这两个向量夹角不为0或180取它们的叉乘就可以获得法线向量对镜脚本写法如下
Vector3 anew Vector3(2,1,1);
Vector3 bnew Vector3(3,0,2);
Vector3 nVector3.Cross(a,b);//n为ab平面的法线。Cross为叉乘
nn.normalized;//将n标准化
四、Vector3
Vector3属于struct结构体这部分给出Vector3的属性、方法、运算符 Vector3属性
字段或属性说明x,y,z略normalized得到标准化向量单位向量magnitude得到向量的模是标量sqrMagnitude得到模的平方。运算速度比得到模要快因为少一部开方运算。在仅比较两个长度不需要求精确求出长度时非常有用 Vector3方法
方法说明Cross 向量叉乘 Dot向量点乘Project计算向量在另一个向量上的投影Angle返回两个向量的夹角Distance返回两个向量的距离
Vector3的运算符有还有-*/。
五、向量坐标系的转换
在Unity中可以使用transform.TransformPoint方法将局部坐标转换为世界坐标也可以使用transform.InverseTransformPoint方法将世界坐标系转换为局部坐标系。
其实也有向量的坐标系转化函数分别是transform.TransformDirection()和transform.InverseTransformDirection()。
下面举一个实例说明如何通过全局坐标系和局部坐标系改变物体的运动方向
1.创建一个Cube设置旋转的Y为300
2.新建脚本CoordinateLocal.cs,内容如下
using UnityEngine;
public class CoordinateLocal:MonoBehaviour{void Update(){transform.Translate(Vector3.forward*Time.deltaTime);}
}
将脚本挂在Cube上运行游戏物体会沿着自身的z轴方向慢慢移动
3.新建脚本CoordinateWorld.cs,内容如下
using UnityEngine;
public class CoordinateWorld:MonoBehaviour{void Update(){Vector3 vtransform.InverseTransformDirection(Vector3.forward);transform.Translate(v*Time.deltaTime);}
}
将新建的脚本挂到Cube上取消勾选原来的脚本运行游戏发现Cube沿着世界坐标系的z轴方向移动了。下面解释一下原因 transform.Translate函数默认是以局部坐标系为基准的因此在脚本1中虽然参数为Vetor3.forward但依然会以局部坐标系的前方为准。 第2个脚本稍微复杂一些。由于Translate默认以局部坐标系为准因此要把世界坐标系的forward转化为局部坐标系的向量v然后用v来作为Translate的参数