前言:今天学习一下向量吧~
1.向量
(1)把预设体(红色箭头)拖入场景中,把它的Transform设为如图所示
(2)创建一个Cube,Transform设为如同所示(让他们的轴心重合,方便操作),如果没有设为轴心先设为轴心
(3)把Cube的位置放在红色箭头前方1米(这里的位置指的是它们的轴心位置)
(4)建立一个球形让它的轴心位置也与红色箭头的轴心位置相同,Transform如图设置
(5)为了方便观察,我们创建一个透明材质球把它放在球形的身上,这里把材质球的Rendering Mode改为Transparent,点击Albedo打开颜色面板
(6)通过H、S、V调节颜色,通过A调节透明度,颜色随意,让它的透明度为0
(7)将材质球拖到球形的身上,此时球形变成了透明的,
(8)创建一个脚本,让红色箭头的前方是Cube的位置
(9)把脚本拖到任意对象身上
(10)实例化对象
(11)我们把Cube的位置拖到球形的外面
(12)现在我们运行,发现刚刚被我们拖出去的Cube现在又与透明球形的表面重合,也就是距离红色箭头前方1米的位置(这里红色箭头的轴心和球形的轴心是重合的,球形的缩放是2,所以球形的半径是1米),也就是说代码中的forward是一个在Z轴正方向上的一个单位长度的向量
总结:transform.forward是一个在Z轴正方向上的一个单位长度(单位长度是1米)的向量,同理我们能够知道
transform.right是一个在X轴正方向上的一个单位长度的向量,
transform.up是一个在Y轴正方向上的一个单位长度的向量.
同理总结:Vector3.forward,Vector3.back,Vector3.right,Vector3.left,Vector3.up,Vector3.down也是一样
2.向量加法
(1)我们把预设体红色箭头、绿色箭头、蓝色箭头都拖到场景中,并让他们的位置重合在一起
(2)为了方便观察数据,我们创建了一个Text用来显示红、绿、蓝他们的位置,我们把它的锚点钉在了左上角,把控制点(蓝色实心点)放大
(3)选中Text,把字体尺寸调整为30,颜色改为红色,方便观察数据
(4)创建一个脚本,实现绿色箭头Z轴方向的单位向量+蓝色箭头Z轴方向的单位向量=红色箭头Z轴方向的单位向量,并将值用Text显示出来
(5)脚本挂载到任意对象身上
(6)把对应的游戏对象实例化
(7)点击运行,我们选中绿色箭头或者蓝色箭头的轴心进行旋转,发现红色的箭头也会根据他们进行相应的变化
(8)这个变化是有规律的,绿色和蓝色箭头的X、Y、Z分别对应着相加等于红色箭头的X、Y、Z,X:0.0+0.0=0.1、Y:0.7+(-0.1)=0.9、Z:1.0+(-0.7)=0.4(因为我们这里的Text只能显示到小数点后一位,所以系统自动进行了四舍六入五凑偶,虽然表面看上去并不相等,实际上是相等的)
3.向量减法
(1)跟向量加法相似,只是代码不同,实现绿色箭头Z轴方向的单位向量-蓝色箭头Z轴方向的单位向量=红色箭头Z轴方向的单位向量,并将值用Text显示出来
(2)让绿色箭头的尾部(轴心)在其他两个的箭头的头部
(3)点击运行,旋转绿色箭头的轴心,红色箭头会随之改变,红色箭头永远指向绿色箭头指向的头部
4.点乘
(1)跟向量加法相似,不过这次我们把红色箭头删除,只用绿色和蓝色就够了,这是代码
(2)点击运行,刚开始的时候,绿色和蓝色箭头同方向,点乘为1
(3)把绿色的沿X轴旋转-90度,让它们两个互相垂直,由于系统无法显示0,我们这里稍微调整一下绿色的沿X轴的旋转角度,此时点乘非常接近于0,说明当它们垂直的时候,点乘为0
(4)把绿色的沿X轴旋转-180度,让他们反向,点乘为-1
总结: 当两个向量同向的时候,点乘为1;
当两个向量垂直的时候,点乘为0;
当两个向量反向的时候,点乘为-1.
5.叉乘
(1)拖入红、绿、蓝3个箭头预设体,将它们Transform都如图设置(方便后面操作)
(2)创建一个Plane,Transform设为如图所示
(3)创建一个脚本,使用Vector3.Cross(进行叉乘的第一个数,进行叉乘的第二个数)方法进行两个Vector3类型的数的叉乘运算,这里是绿色箭头的向量和蓝色箭头的向量叉乘等于红色箭头的向量
(4)我们平移绿色和蓝色箭头的位置,并让蓝色箭头沿Y轴旋转90度,达到下图中的效果
(5)把脚本挂载到任意对象的身上,然后把对应的游戏对象拖到脚本中,进行实例化
(6)在运行前红色的箭头是与绿色、蓝色箭头以及Plane是平行的,当我们点击运行的时候,红色的箭头跟绿色、蓝色箭头垂直,准确的说是与绿色和蓝色箭头形成的一个平面垂直(这里的Plane是为了方便观察绿色和蓝色箭头形成的平面而特意建造出来的)
(7)取消运行,我们继续实验,把绿色和蓝色设为Plane的子物体
(8)点击运行,这次我们选中Plane,旋转它的轴心,发现红色箭头始终垂直于Plane,那么也就是说红色箭头始终垂直于绿色和蓝色箭头形成的平面,实验完成
总结:叉乘运算的两个向量的运算结果向量,它的方向始终与进行叉乘运算的两个向量方向形成的平面垂直
6.叉乘实例
使用叉乘做一个与前进方向垂直的轴,让物体一直以这个轴旋转,相当于一个车轮,无论往哪个方向,车轮的轴心都是与前进方向垂直的
(1)创建一个Cube,让它相当于车轮,把坐标系改为Global(如果是Local的话,它的位置实时发生改变)
(2)创建一个脚本,实现让给旋转方向始终与当前移动方向垂直,将脚本挂载到Cube身上,旋转速度设为1000(太小的话无法观察到效果)
(3)点击运行,拖动一个轴移动,Cube像车轮一样旋转移动,完成~
7.Other
(1)Vector3类的标准化向量:
<1>方法一:对象.normalized;
<2>方法二:类名.Normalize(对象);
(2)向量求模(大小)
<1>方法一(数学求模方法):Mathf.Sqrt(Mathf.Pow(对象.x,2)+Mathf.Pow(d对象.y,2)+Mathf.Pow(对象.z,2));
<2>方法二:对象.magnitude;
<3>方法三:类名.Magnitude(对象);
(3)求两点之间的距离(Vector2)
<1>方法一:两个Vector2类型的数相减得到第三个Vector2类型的数,然后对其求模
<2>方法二:类名.Distance(第一个点的参数,第二个点的参数);
8.四元数
本质是个高阶复数=-=,貌似很复杂,这里我们只要会基本使用它的方法就可以了
实现旋转的方法有三种:矩形旋转、欧拉旋转、四元数旋转,下面我们分别分析他们的优缺点
矩阵旋转
优点:
旋转轴可以是任意向量;
缺点:
旋转其实只需要知道一个向量+一个角度,一共4个值的信息,但矩阵法却使用了16个元素;
而且在做乘法操作时也会增加计算量,造成了空间和时间上的一些浪费;
欧拉旋转
优点:
很容易理解,形象直观;
表示更方便,只需要3个值(分别对应x、y、z轴的旋转角度);但按我的理解,它还是转换到了3个3*3的矩阵做变换,效率不如四元数;
缺点:
之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的,因此不同的顺序会造成不同的结果;
会造成万向节锁(Gimbal Lock)的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是要原先的顺序)都不可能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。这里有个视频可以直观的理解下;
由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;
四元数旋转
优点:
可以避免万向节锁现象;
只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高;
可以提供平滑插值;
缺点:
比欧拉旋转稍微复杂了一点点,因为多了一个维度;
理解更困难,不直观;
(1)围绕某个轴旋转一定度数:Quaternion.AngleAxis(旋转的度数,旋转的轴);
(2)通过rotation围绕某个轴旋转一定角度:Quaternion.Euler(围绕X轴旋转的度数,围绕Y轴旋转的度数,围绕Z轴旋转的度数);
(3)四元数归零:Quaternion.identity;
如果想深究其中的原理的话,关于四元数这里有篇很好的文章:【Unity技巧】四元数(Quaternion)和旋转:http://blog.csdn.net/candycat1992/article/details/41254799
9.异常
try
{
要检测的代码
}
catch(System.Exception e)
{
如果捕获到异常之后进行的语句
}
finally
{
无论捕没捕获到异常都会执行的语句
}
关于数学方法,这里有篇不错的文章,大家感兴趣可以看看Unity Mathf 数学运算(C#):http://zhboy666666.iteye.com/blog/1679637
最后:总算写完了=-=,明天见~