认识3D数学

前言:今天学习一下向量吧~


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(第一个点的参数,第二个点的参数);

代码贴图
用Text显示结果

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


最后:总算写完了=-=,明天见~

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

推荐阅读更多精彩内容

  • 1 前言 OpenGL渲染3D模型离不开空间几何的数学理论知识,而本篇文章的目的就是对空间几何进行简单的介绍,并对...
    RichardJieChen阅读 6,870评论 1 11
  • 1.Transform 位置:世界坐标,当地坐标,通过属性和方法操作;使用属性的时候默认是世界坐标 调整位置: 通...
    Joe_Game阅读 848评论 0 0
  • 1 有次我们同事聚餐,大家开始八卦各自的初恋故事。 一位向来思维严谨的同事提出了质疑: 初恋的定义和标准是什么? ...
    了了的客厅阅读 851评论 0 1
  • 一件事情要把它有始有终地完成,就已经很不易。如果要把它做到极致,除了坚持不懈以外,还需要什么?你,有思考过吗?或许...
    风一般女子阅读 605评论 0 1
  • 星期日,我正在读书,妈妈说带我去超市买小食品,我非常高兴!就在我兴冲冲的刚要冲出门的时候,我忽然想起一件事情,...
    summer61阅读 419评论 0 0