unity3d 数学的数学基础和辅助类

转载注明smartdot:http://my.oschina.net/u/243648/blog/67193

1.  数学(点乘/叉乘)/unity3d的数学辅助类

2.  坐标系统(本地/世界/屏幕)

3.  Unity3d执行流程

4.  计算角色和目标点的夹角。旋转角色朝向目标点,然后移动角色(样例)

5.  Gizmos/inspector/地图编辑

6.  脚本文件间的数据交互

7.  Yield return/协同线程/事件

8.  Socket

9.  Unity3D调用c++DLL

---------------------------------------------------------------

---------------------------------------------------------------

一.  Unity3d中须要的基础数学知识(vector/matrix/transform)

看到这几个单词,我想在游戏引擎里面都挺常见的,unity3d里面也不例外!

尽管unity给我们封装的这么好。会用就能够了,可是知其然。还是对自己比較有帮助的。由于以后要是该用其它的引擎了呢?不想一辈子都被这些工具牵制的话。就必须理解这些可能会比較枯燥的数学知识了。当然这里面不会去讨论太过复杂的数学知识。当然有兴趣,能够多看点,可是不用花费他多的时间(除了想当数学家的除外),不明确的时候看一看就ok了。有了这些知识,再去看那些unity3d给我的数学辅助类,就用起来就清爽非常多了!

1.  向量(vector)

向量有两个重要的属性长度和方向,举样例吧!在空间里面物体移动要知道物体移动的方向和距离用向量这个数学工具就很方便描写叙述。还有摄像机的观察方向、光线的走向等。

在不包括位置信息,所以它能够独立于坐标系统。仅仅要向量长度和方向同样就能够觉得是相等的。

引入坐标系统不会给向量加入额外的信息。

所以向量的位置不会影响他的属性。

在讨论位置和向量的时候,有一个非常easy混淆的概念,就的点和向量,在unity3d中有时候用vector类描写叙述一个点,由于vector里面有x、y、z三个float变量。Vector(x,y,z)是点还是向量,要细致斟酌。或者我理解有误,有知道的朋友希望告知。

单位向量和向量的模这两个概念非常基础也非常重要。详细概念我就不反复了,可是要知道这两个向量有什么作用。

单位向量能够用来表示方向。模能够用来表示距离。我门能够用这两个概念去计算物体往哪一个方向移动,移动距离是多少。至于物体旋转。要涉及到向量的计算,后面会提及到。

向量运算包含:加法、减法、数乘、叉积,对于运算,就不提及数学计算和概念了。

百度下都知道了。大家都是有文化的人,哈哈..开玩笑了!

举样例吧!想象下你要去跟踪一个物体移动。你发现自己的跟踪方向有了偏差。你要怎么修正的方向呢?假设你说用眼睛,那能够,可是计算机是瞎的啊!

你给计算机按个眼睛吧!计算机仅仅会数值计算,当然你要用数学模型去表述了。然后计算啦!

这时候你能够用向量减法,画下向量减法的图像,是不是非常方便就能够攻克了!

再举一个样例,你要去追击一个物体,他总是东拐西拐的。我要速度比他快,可是方向不正确的话是非常难去拦截他下来的。那我要怎么办呢?想象下向量加法的图形。依据两个人的速度,仅仅要我的速度比你快,用向量加法和数乘(数乘能够用来控制速度)。我就能够在路上给你按木桩,让你撞死,守株待兔还是前途的嘛。

再举一个样例。假设我想知道目标物体,偏我的角度是多少。我可用点积,计算出我门的角度。样例还有非常多,懒得举了,不然就成举重冠军了,给个连接:

http://wenku.baidu.com/view/f279471514791711cc79176a.html

说完向量,我想提及一个小细节,非常有必要的细节。由于向量的x、y、x是float类型的。由于float的不精确。我门应该觉得两个浮点相等的能够存在一定的误差的。我门在看到一些游戏代码里面两个浮点数相等可能是这种:

Const float EPSILON=0.001f;//误差范围

bool Equal(float num1,float num2)

{

//仅仅要num1和num2在误差范围内,就觉得相等放回真,否则放回假

Return fabs(num1-num2)<EPSILON?true:false;

}

2.  矩阵(matrix)与变换(transform)

矩阵这玩意是用来干嘛用的呢?大学老师没告诉过我们,至于为什么不告诉我们呢?就不加讨论了。反正教我的是业余的!毕竟老师没有告诉过我。错了希望要指正我啊!

矩阵在数学书上说是是由方程组的系数和常数组成的。从数学原理上, 矩阵代表了从一个线性空间到还有一个线性空间的变换.

通过一个教科书上的样例,简单的描写叙述下计算公式,预计是比較笨的原因。我不喜欢直接用数学符号描写叙述。仅仅喜欢看图。

矩阵说白了。个人理解就是让你“穿越”用的,让你的向量从一个空间转换到另外一个空间的向量。一个位置移动(或者旋转)到另外一个位置。

至于空间有本地坐标系统,世界坐标系统,屏幕坐标系统等,以后会谈及。我门看下矩阵变换有几种:平移,旋转,缩放,这些unity3d都已经封装好了。

想详细看下他们是怎么变换的。我懒得绘图板画了,去网络上找一个图片来!

依照矩阵的算法,用向量乘以变换矩阵套下公式,比較下转换前后的值,就知道了!

每一种变换,都有相应的变换矩阵。用向量或坐标乘以变换矩阵,就可以对它们完毕变换。变换矩阵之间,也能够做乘法叠加,叠加的几何意义是把变换按叠加的先后顺序复合到一个矩阵中去。注意矩阵叠加不满足交换律。变换矩阵是一个4 x 4的矩阵,所以向量和坐标须要扩展到齐次空间中。

向量:(x, y, z, 0)

坐标:(x, y, z, 1)

他们的差别在于第四项。向量的第4项取0。能够使矩阵的平移变换失效,而不影响旋转和缩放运算。

坐标第4项取1,使平移有效,而且平移变换的比例不会被变化。

假设取2。则其平移的距离则是矩阵中定义的2倍。

以此类推。

注意,在变换后,有可能出现第4项非0/1 的情况。这个时候,我们必需要做一个映射动作,将它从齐次空间映射回3维空间。方法非常easy:

(x, y, z, w) --> (x/w, y/w, z/w, w/w) --> (x/w, y/w, z/w, 1) --> (x/w, y/w, z/w)

3.  平面(plane)与射线(Ray)

平面:

n Dot P + d = X;

X<0,点P位于平面的背面,|X| 即点P到平面的距离

X>0。点P位于平面的正面,|X| 为点P到平面的距离

射线:

设起点为P0, 方向为u,t 为參数。t 属于 [0, 无穷大),当t 属于(-无穷大。+无穷大)时就表示直线。

p(t) = p0 + t * u

之所以要将他们一起放一起是他们两在实际的开发中,是常在一起使用的。至少我用的比較多,举个样例吧。

比方我们点击下2D的屏幕坐标,要确定游戏3D空间中位置。怎么确定呢?怎样用仅仅有x,y轴的二维鼠标。尽量精准的取得x,y,z三维空间的位置,是一个从三维出现就一直被讨论的主题。即使在图形技术如此发达的今天,三维空间的点击仍然仅仅能说"大概准确"。鼠标点击来确定三维空间的位置和摄像机的关系非常大。为什么要说和摄像机有非常大的关系呢?假设你熟悉Direcx3D里面的绘制流水的话,就知道摄像机把3d空间坐标转化为屏幕坐标起着非常关键的作用,如裁剪(clipping)。投影窗体(projection
window)。近裁减,远裁剪,投影平面等。

写一个段unity的代码吧!

(代码格式调不好,就随便看下吧)。

void Update ()

{

if(Input.GetMouseButtonDown(0))

{

RayControl();

}

if(flagMove)

{

if(Vector3.Distance(transform.position,mousePos)>1)

{

transform.Translate(transform.worldToLocalMatrix* ransform.forward* Time.deltaTime*5);//transform.forward是世界坐标,通过transform.worldToLocalMatrix转换矩阵转到本地坐标 然后在本地坐标运动,没有必要必须在本地坐标系运动 可是必须注意要统一起来。

}

else

{

flagMove=false;

}

}

}

void RayControl()

{

Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);//向屏幕发射一条射线(注意这个对象是主摄像机哦)

if(Physics.Raycast(ray,out hit,200))射线长度为200 和地面的碰撞盒做检測

{

GameObject targetPos=GameObject.CreatePrimitive(PrimitiveType.Sphere);//实例化一个Sphere

targetPos.transform.localScale=new Vector3(0.5f,0.5f,0.5f);

mousePos=hit.point;//获取碰撞点坐标

mousePos.y=transform.position.y;

targetPos.transform.position=mousePos;//Sphere放到鼠标点击的地方

targetDir=mousePos-transform.position;//计算出朝向

Vector3 tempDir=Vector3.Cross(transform.forward,targetDir.normalized);//用叉乘推断两个向量 是否同方向

float dotValue=Vector3.Dot(transform.forward,targetDir.normalized);//点乘 计算两个向量的夹角,及角色和目标点的夹角

float angle=Mathf.Acos(dotValue)*Mathf.Rad2Deg;

if(tempDir.y<0)//这块 说明两个向量方向相反。这个推断用来确定 假如两个之间夹角30度 究竟是顺时 还是逆时针旋转。

{

angle=angle*(-1);

}

print(tempDir.y);

print("2:"+angle);

transform.RotateAround(transform.position,Vector3.up,angle);

flagMove=true;

}

}

注意事项:写完了才发现 原来不是必需这么麻烦,这样transform.forward=(mousePos-transform.position).normalized就能够直接让角色朝向目标点 RayControl函数 好多都能够省了

4.  unity3d 数学辅助类

4.1      Mathf提供数学计算的函数与常量,面有全部数学计算时须要用到的函数。

Mathf对象没有构造函数,是一个固有的对象。并不像String那样是对象的类,因此没有构造函数 Math()。

4.2      Matrix4x4一个标准的4x4变换矩阵一个变换矩阵能够运行随意的线形3D变换(比如。平移,旋转,缩放,切边等等)并且透视变换使用齐次坐标。脚本中非常少使用矩阵:最经常使用Vector3,Quaternion,并且Transform类的功能更简单。单纯的矩阵用于特殊情况,如设置非标准相机投影。

4.3      Quaternion四元数用于表示旋转它们基于复数的并不easy被直观地理解。因此你没有必要訪问或改动单个Quaternion组件(x,y,z,w);通常你仅仅需把现有的旋转(比如,来自Transform)并使用它们来构造新的旋转(比如,在两个旋转间平滑地插值)。四元数函数你99%的时间你会使用它(其它函数仅额外使用)

Quaternion.LookRotation,Quaternion.Angle,Quaternion.Euler,Quaternion.Slerp,Quaternion.FromToRotation,Quaternion.identity

4.4      Ray射线是一个无穷的线,開始于origin并沿着direction方向

4.5      Rect一个由x、y位置和width、height大小定义的二维矩形,Rect结构主要用于2D操作。UnityGUI系统非常普遍的使用它。以及在屏幕上定位摄像机

4.6      Vector2/vector3/vector4 表示向量和点, 结构用于在Unity传递3D位置和方向。它也包括做些普通向量运算的函数,如角度。模,单位向量,叉乘,点乘,向前向左向右向上。插值。投影,反射,转向……..

4.7   最后一个大总管,transform物体的位置、旋转和缩放,场景中的每个物体都有一个Transform。用于储存并操控物体的位置、旋转和缩放。

每个Transform能够有一个父级,同意你分层次应用位置、旋转和缩放。

能够在Hierarchy面板查看层次关系。他们也支持计数器(enumerator)。因此你能够使用循环遍历子物体。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-11-08 23:56:18

unity3d 数学的数学基础和辅助类的相关文章

提升机器学习数学基础,这7本书一定要读-附pdf资源

文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | KDnuggets 作者 | Ajit Jaokar 转自 | 新智元 编辑 | 大明 [编者按]机器学习和数据科学离不开数学,本文从数学基础的角度入手,推荐了数据科学和机器学习方面的七本参考书以及两本补充读物.相信对打好数学基础的相关人士会有所帮助. 大多数人学习数据科学的人都会把重点放在编程上,实际上编程能力确实是机器学习和数据科学领域的重要技能.但是,要真正精通数据科学和机器学习,必

点乘和叉乘

unity3D里面的点乘和叉乘 http://www.cnblogs.com/lifangti/p/unity3D.html http://blog.csdn.net/oskytonight/article/details/38900087 http://www.guokr.com/answer/657618/ [Unity3D学习]3D数学基础之向量 http://blog.gamerisker.com/archives/347.html

Unity3D for VR 学习(6): 再次温故知新-3D数学

一年前,系统学习过3D数学,并记录了一篇博客<C#程序员整理的Unity 3D笔记(十):Unity3D的位移.旋转的3D数学模型>. 一年后,再次温习之. 坐标系:Unity3D使用左手笛卡尔坐标系(Descartes coordinate system) 世界坐标系(world space):在一个游戏场景中,唯一. 物体坐标系\局部坐标系(local\Object space):每个物体有各自的独立的坐标系.如桌子的物体坐标系中,扶手相对桌子腿位置.有时候,不需要对外暴漏太多细节. 摄像

Unity3D之空间转换学习笔记(三):3D数学

3D数学基础 向量 向量可以看做具有方向和大小的一条线段. 比如:我们如果用点A减去点B,则可以得到一个向量,该向量的方向为点B面向点A的方向,而大小为两点的距离.这个方法在游戏开发中经常用到,比如我们要让物体B面向物体A,一般都是使用物体B的位置减去物体A的位置,得到的向量取模. 点积 向量的点积表示一个向量在另一个向量上的投影,如下: 而相互垂直的两个向量点积为0: 我们可以使用这个特性来判断两个向量是否垂直. Unity提供的计算点积的方法如下: public static float D

【Unity3d游戏开发】Unity3D中的3D数学基础---向量

向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3D数学知识. 一.向量概念及基本定义 1.向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量就是一个数组. 向量的维度就是向量包含的"数"的数目,向量可以有任意正数维,标量可以被认为是一维向量. 书写向量时,用方括号将一列数括起来,如[1,2,3] 水平书写的向量叫行向量 垂直书

Unity3D用初中数学方法解决第三人称视角变换

鉴于博主的数学只有初中水平(博主是初中生),又想实现第三人称的摄像机位置角度变换,所以博主搞了个最多用到初三四点共园基础知识的算法,还没实现..先写个思想看看 蛤蛤先上图 好了这就是全部算法的核心思想,我们下期再见 还有几个问题需要解决. 问题一:如果在视角变换中摄像机在地形内部怎么办? 这个很好办,如果摄像机不断与地形产生trigger函数,只要不断减少r就行了.当r过小被物体基本碰撞时,将摄像机置于物体上方.在公式中可以看出除了r其他参数是不变的. 问题二:我们考虑的屏幕是一维的,那如何处理

机器学习数学系列(1):机器学习与数学基础知识

目录: 机器学习基础: 机器学习的分类与一般思路 微积分基础: 泰勒公式,导数与梯度 概率与统计基础: 概率公式.常见分布.常见统计量 线性代数基础: 矩阵乘法的几何意义 这是一张非常著名的图,请仔细挖掘其信息量.以期它在整体上指引我们的学习. 1 机器学习基础 1.1 机器学习分类 有监督学习.无监督学习.半监督学习的概念自行了解一下,不再赘述,简单贴3幅图,自行比对.       1.2 机器学习的一般思路 得分函数: 损失的函数的最优化问题: (左)非凸函数               

Unity3d修炼之路:游戏开发中,3d数学知识的练习【1】(不断更新.......)

#pragma strict public var m_pA : Vector3 = new Vector3(2.0f, 4.0f, 0.0f); public var m_pB : Vector3 = new Vector3(-4.0f, 2.0f,0.0f); private var m_pTemp : Vector3 = new Vector3(0.0f,0.0f,0.0f); private var m_fTemp : float = 0.0f; private var m_fAngle

【数学基础篇】--详解人工智能之数学 积分学,概率空间,大数定律和中心极限定理

一.前述 上一篇我们讲到了微分学,本文我们接着讲解积分学,以及概率的相关知识. 二.本节常用符号如下. 三.积分 1.积分定义 将一个函数对应的区间n等分,然后加和求极限. 2.积分理解 代数意义: 无穷求和 几何意义: 函数与 X 轴之间的有向面积. 3.(牛顿-莱布尼茨公式) 如果 f(x) 是定义在闭区间 [a, b] 上的可微函数, 那么就有 不定积分表示为 牛顿-莱布尼茨公式展示了微分与积分的基本关系: 在一定程度上微分与积分互 为逆运算. 4.案例 求函数 ln(x) 的不定积分.