精华内容
下载资源
问答
  • Unity3D数学

    2018-06-13 18:35:30
        3D数学:研究在3D几何世界中的数学问题。被广泛的应用于使用计算机来模拟3D世界的领域,比如图形学,游戏,虚拟现实和动画等。     为什么要学习3D数学:掌握了3D数学的知识之后,将来学习图形学、游戏...

        3D数学:研究在3D几何世界中的数学问题。被广泛的应用于使用计算机来模拟3D世界的领域,比如图形学,游戏,虚拟现实和动画等。
        为什么要学习3D数学:掌握了3D数学的知识之后,将来学习图形学、游戏制作都有很大的帮助。

    1D

        3D:three dimensions,立体空间。

        1D:关于计数和度量的数学。
        数学上,数轴是个一维的图,整数作为特殊的点均匀地分布在一条线上。数轴是一条规定了原点、方向和单位长度的直线。


    这里写图片描述

    2D

        2D:关于平面的数学。
        数学上,相交的两条直线可以确定一个唯一的平面。相交于原点的两条数轴,构成了平面放射坐标系。
        如果两条数轴上的度量单位相等,则称此放射坐标系为笛卡尔坐标系。
        数轴互相垂直的笛卡尔坐标系,称为笛卡尔直角坐标系。


    这里写图片描述

        否则称为笛卡尔斜角坐标系。


    这里写图片描述

        在2D笛卡尔坐标系中,我们用(x,y)来表示一个点。称之为坐标。
        坐标的每个分量都表明了该点与原点之间的距离和方位。每个分量都是到相应轴的有符号距离。


    这里写图片描述

    3D

        3D:关于3D空间的数学。
        从2D扩展到3D:相对于2D笛卡尔坐标系,我们需要3个轴来表示三维坐标系,一般叫做空间直角坐标系。
        第3个轴一般被称为z轴。一般情况下,3个轴互相垂直。


    这里写图片描述
        任意2个轴可以组成一个平面,我们一般称为XY平面,XZ平面,YZ平面,每个平面又与另一个轴相垂直。我们可以认为这3个平面是3个2D笛卡尔空间。
        在3D中,我们用(x,y,z)来表示一个点。坐标的每个分量分别代表了该点到yz,xz,xy平面的有符号距离。

    这里写图片描述

    左手坐标系与右手坐标系

        z轴方向的确定有2种方式:左手坐标系与右手坐标系。
        左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
        右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。


    这里写图片描述

    这里写图片描述

    展开全文
  • unity3D 数学基础课件

    2018-03-27 21:39:59
    课件为ppt形式,里面详细讲解了坐标系,向量,标量,矩阵等知识。
  • unity 3d 数学基础

    2020-03-13 00:04:33
    unity中 的旋转顺序是zxy 但在unity中物体的旋转是带动自身坐标轴的,这样的结果和不带坐标轴旋转的结果反顺序是一致的,所以复合矩阵是MzMxMy |旋转的是unity世界坐标 坐标空间(p为父坐标系,c为字坐标系) Ap=Mc...
    • 向量的 点乘

      • a·b=|a|*|b|*cosα
      • a点乘b 可以看做,b向量投影到a向量的上投影值 在乘以a的模长 ,如果a为单位向量,通过点乘值直接获取投影值
      • a·b 如果单看正负,可得,如果α>90 值为负数,a<90值为正数 0 为90
      • a·b=b·a a·(b+c)=a·b+a·c
      • (a x,a y)·(b x,b y)=a x*b x+a y*b y
    • 向量的 叉积

      • a×b=(a x,a y,a z)×(b x,b y,b z)=(a yb z-a zb y,a zb x-a xb z,a xb y-a yb x)
      • 叉积的结果得到一个⊥a和b的新向量
      • 证明
        Ax+By+Cz=0 => -x= (By+Cz)/A =>
        ax+by+cz=0 => -x= (by+cz)/a => (aB-Ab)y=(Ac-aC)z
      • 叉积只满足反交换率 a×b=-(b×a)
      • |a×b|=|a|*|b|*sinα
      • 叉积的模是a 和b围成的平行四边形面积
      • 叉积的结果向量的方向是由 a和b 的位置关系决定的 如果a和b 顺时针结果为负,反之为正
        证明,假设 z为判断轴 z值为a xb y-a yb x,此时不需要大小,所以看为单位向量,结果可以写为cosAsinB-sinAcosB=sin(B-A) 所以 B-A的结果就是方向的正负
    • 矩阵 (M为矩阵 k为系数)

      • k*M=Mk

      • nm 的矩阵 和mu 的结果是 n*u 第一个矩阵的行必须等于第二个矩阵的列才可以相乘

      • MN ≠NM

      • (MN)C=M(NC)

      • 对角矩阵 对角元素都为0的矩阵
        | 3 0 0 |
        | 0 3 0 |
        | 0 0 3 |

      • 单位矩阵 MN=NM=M
        | 1 0 0 |
        | 0 1 0 | =N
        | 0 0 1 |

      • 转置矩阵 MT

        | 3 1 | == | 3 0 1 |
        | 0 3 |T = | 1 3 2 |
        | 1 2 |

        • (MT)T=M
        • (AB)T=BTAT
      • 逆矩阵

        • MM-1=M-1M=I
        • (MT)-1=(M-1)T
        • (AB)-1=B-1A-1
      • 正交矩阵

        • 如果MMT=MTM=I 等价于M-1=MT 那么这个矩阵是正交矩阵
        • 正交矩阵的特点 点积都为1,即如果每一个分量模都为1,那么说它们是一组标准正交基,如果不为1,它们是一组正交基
      • 矩阵的变换

        • 线性变换
          • f(x)+f(y)=f(x+y)
          • 缩放变换,旋转变换等
        • 仿射变换
          • 线性变化和平移变换 合并等于仿射变换
    • 齐次坐标

      • 因为33的矩阵无法对3维进行平移变换,所以扩展到44的矩阵来变换3维,这样的结果导致每个分量都为4维,这样的分量被叫做齐次坐标
      • 第四个值 如果是0代表为矢量,1为标量
      • 缩放矩阵
        | k 1| 0   | 0   | 0 |
        | 0  | k 2 | 0 | 0 |
        | 0  | 0   | k 3 | 0 |
        | 0  | 0   | 0   | 1 |
      • 旋转矩阵 绕x轴旋转α
        | 1 | 0      | 0       | 0 |
        | 0 | cosα | -sinα | 0 |
        | 0 | sinα  | conα | 0|
        | 0 | 0      | 0      | 1 |
      • 复合变换
      • M旋转M缩放M平移p 代表p依次进行平移旋转缩放,需要注意的是顺序很重要,不同的顺序有不同的结果
      • 在unity中 的旋转顺序是zxy 但在unity中物体的旋转是带动自身坐标轴的,这样的结果和不带坐标轴旋转的结果反顺序是一致的,所以复合矩阵是MzMxMy |旋转的是unity世界坐标
    • 坐标空间(p为父坐标系,c为字坐标系)

      • Ap=McpAc | cp代表从c坐标系变为p坐标系
      • 过程推导
      • c→p坐标 c原点在p里的坐标加上需要转换的坐标即可 ,p→c为 c→p的矩阵的逆矩阵
      • | xx| xy| xz|ox|
      • | yx| yy| zz|oy|
      • | zx| zy| zz|oz|
        | 0  | 0 | 0 | 1 |     其中xx代表c坐标系x轴的x的值在p坐标系中的表示 o表示c坐标轴原点在p中的位置 , 0001 对应3个坐标轴 一个点,其中没有要求xyz为单位矢量,因为存在缩放的话需要动态改变对应的矢量
      • p→c 如果c→p是一个正交矩阵那么结果为 c→p矩阵的转置
    展开全文
  • 1.数学(点乘/叉乘)/unity3d数学辅助类 2.坐标系统(本地/世界/屏幕) 3.Unity3d执行流程 4.计算角色和目标点的夹角。旋转角色朝向目标点,然后移动角色(样例) 5.Gizmos/inspector/地图编辑 ...

    转载注明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)。因此你能够使用循环遍历子物体。


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

    转载于:https://www.cnblogs.com/lcchuguo/p/4678246.html

    展开全文
  • 1. 数学(点乘/叉乘)/unity3d数学辅助类 2. 坐标系统(本地/世界/屏幕) 3. Unity3d运行流程 4. 计算角色和目标点的夹角,旋转角色朝向目标点,然后移动角色(例子) 5. Gizmos/inspector/...

    转载注明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

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

    在不包含位置信息,所以它可以独立于坐标系统。只要向量长度和方向相同就可以认为是相等的。引入坐标系统不会给向量添加额外的信息。所以向量的位置不会影响他的属性。在讨论位置和向量的时候,有一个很容易混淆的概念,就的点和向量,在unity3d中有时候用vector类描述一个点,因为vector里面有xyz三个float变量。Vectorx,y,z)是点还是向量,要仔细斟酌。或者我理解有误,有知道的朋友希望告知。

     单位向量和向量的模这两个概念很基础也很重要。具体概念我就不重复了,但是要知道这两个向量有什么作用。单位向量可以用来表示方向,模可以用来表示距离。我门可以用这两个概念去计算物体往哪一个方向移动,移动距离是多少。至于物体旋转,要涉及到向量的计算,后面会提及到。

     向量运算包括:加法、减法、数乘、叉积,对于运算,就不提及数学计算和概念了。百度下都知道了,大家都是有文化的人,哈哈..开玩笑了!举例子吧!想象下你要去跟踪一个物体移动,你发现自己的跟踪方向有了偏差,你要怎么修正的方向呢?如果你说用眼睛,那可以,但是计算机是瞎的啊!你给计算机按个眼睛吧!计算机只会数值计算,当然你要用数学模型去表述了,然后计算啦!这时候你可以用向量减法,画下向量减法的图像,是不是很方便就可以解决了!再举一个例子,你要去追击一个物体,他总是东拐西拐的,我要速度比他快,但是方向不对的话是很难去拦截他下来的,那我要怎么办呢?想象下向量加法的图形,根据两个人的速度,只要我的速度比你快,用向量加法和数乘(数乘可以用来控制速度),我就可以在路上给你按木桩,让你撞死,守株待兔还是前途的嘛。再举一个例子,如果我想知道目标物体,偏我的角度是多少,我可用点积,计算出我门的角度。例子还有很多,懒得举了,不然就成举重冠军了,给个连接:

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

     说完向量,我想提及一个小细节,很有必要的细节。因为向量的xyxfloat类型的。由于float的不精确,我门应该认为两个浮点相等的可以存在一定的误差的。我门在看到一些游戏代码里面两个浮点数相等可能是这样的:

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

    bool Equal(float num1,float num2)

    {

     //只要num1num2在误差范围内,就认为相等放回真,否则放回假

      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维空间,方法很简单:
    (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为参数,属于 [0, 无穷大),当属于(-无穷大,+无穷大)时就表示直线。
    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变换(例如,平移,旋转,缩放,切边等等)并且透视变换使用齐次坐标。脚本中很少使用矩阵:最常用Vector3Quaternion,而且Transform类的功能更简单。单纯的矩阵用于特殊情况,如设置非标准相机投影。

    4.3      Quaternion四元数用于表示旋转它们基于复数的并不容易被直观地理解,因此你没有必要访问或修改单个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一个由xy位置和widthheight大小定义的二维矩形,Rect结构主要用于2D操作。UnityGUI系统很普遍的使用它,以及在屏幕上定位摄像机

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

    4.7   最后一个大总管,transform物体的位置、旋转和缩放,场景中的每一个物体都有一个Transform。用于储存并操控物体的位置、旋转和缩放。每一个Transform可以有一个父级,允许你分层次应用位置、旋转和缩放。可以在Hierarchy面板查看层次关系。他们也支持计数器(enumerator),因此你可以使用循环遍历子物体。

    展开全文
  • 数学里有大小和方向的量就是向量。在几何中,向量可以用一段有方向的线段表示。 1.向量的运算 (1)加减法:向量的加法(减法)为各个分量的相加(相减)。 a(2,2,3)+b(1,1,1) = c(2+1,2+1,3+1); a(2,2,3)-...
  • Unity 3D数学之欧拉角

    2019-10-17 11:57:01
    什么是欧拉角 ...Unity引擎限制沿x轴旋转范围如下: 用欧拉角做旋转代码如下; public Vector3 eluer; private void OnGUI() { eluer = this.transform.eulerAngles; if (GUILayout.Repe...
  • Unity3D数学之向量基础

    2017-08-06 10:17:57
    Unity中左手坐标系中,可以使用左手法则,以左手手掌指向M的方向,弯曲四指指向N的方向,此时拇指方向即为叉乘结果的方向,向下为负,向上为正。 叉乘最重要的应用就是创建垂直于平面、三角形或...
  • Unity 3D 数学之向量

    2019-10-16 12:58:10
    进入Vector3类,operator定义这个数据类型(Vector3)都能使用哪些运算符 什么是向量 计算向量模长的三种方法 this.transform.position是世界坐标,vector.zero是世界原点 获取向量的方向 ......
  • Unity3D数学——向量

    2018-06-13 19:51:41
        在数学中,向量(也称为矢量),是指具有大小和方向的量。     向量的大小就是向量的长度,也叫做模。向量的方向描述了空间中向量的指向。 ![这里写图片描述]...
  • Unity使用的是笛卡尔左手坐标系,X水平方向,Y垂直方向,Z深度。 2.屏幕坐标系 建立在屏幕上的二维坐标系,用来描述像素在屏幕上的位置。 Transform组件的 Transform.TransformPoint方法将坐标点从局部坐标系...
  • Unity 3D 数学之三角函数

    千次阅读 2019-10-16 16:18:20
    首先讲下:角的度量方式 角度与弧度的换算 三角函数
  • Unity3d数学基础之向量

    2016-06-03 08:58:00
    这只是基础的一些数学知识,后面会为大家...向量是2D、3D数学研究的标准工具,在3D游戏中向量是基础。 一、向量 1、向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量就是一个数组。 向量的维度就是向量...
  • Unity是左手坐标系 , 所以结果向量的方向与之相反 。 数学规律: 叉乘不满足交换律,但是满足反交换律: a ⃗ × b ⃗ ≠ b ⃗ × a ⃗ \vec a ×\vec b\neq \vec b ×\vec a a × b ̸ ​ = b × a a ⃗...
  • Unity3d数学公式之线段相交

    千次阅读 2015-05-04 10:52:55
    这一篇写一下线段相交的代码 在2d游戏中可能会经常使用到 需要的朋友拿走吧 public static bool IsSegmentIntersectionWithSegment(ref Vector2 segment0Start, ref Vector2 segment0End, ref Vector2 segment1...
  • 数学公式相信是一些开发者头疼的一个问题 尤其是数学基础不太好的同学 开发的时候能找到一个正确的又好用的现成的代码断是一件很happy的事情 这里我就将我之前项目里面实际使用过的代码段直接放出来 有需要的朋友...
  • Unity3D数学基础之3D坐标系(一)

    千次阅读 2017-03-30 12:47:19
    一般而言3D软件都是采用笛卡尔坐标系来描述物体的坐标信息。 左手坐标系:Y轴指向上方,X轴指向右方,Z轴指向前方。伸出左手,大拇指指向X轴,食指指向Y轴,中指能指向的方向就是Z轴右手坐标系:X轴和Y轴同左手...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,329
精华内容 2,131
关键字:

unity3d数学