2017-02-15 13:18:38 u012632851 阅读数 884
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16447 人正在学习 去看看 姜雪伟

版本:unity 5.4.1  语言:C#

 

2017年了,使用Unity也有一段时间了,略有心得吧,基本上要求一些功能可以拼拼凑凑地做出来,算是入门了吧。

 

不过很多游戏上使用的技术还没有接触过,比如protobuf、热更新、Shader之类,今年的一开始接触一下游戏中常用的技术,然后Shader方面好好入门一下。当然好早之前的3D游戏开发大师也会在今年早期看完。

 

暂定这些目标吧,好好磨练一下技术。

 

今天给大家带来的是矩阵和四元数,首先矩阵说实话在Unity今天还是第一次,找Api都花了点时间,不过使用下来还是挺容易的,跟代数很像。

 

首先是最简单的平移矩阵:(看的实战核心技术,不过书里很多矩阵都是错的)

1   0     0    0

0   1     0    0

0   0     1    0

Tx  Ty  Tz  1

 

Tx、Ty、Tz是x、y、z轴移动的数值,具体使用的话,使用Matrix4x4 mat = new Matrix4x4();创建矩阵对象,然后乘以new Vector4(x, y, z, 1f)表示的三维坐标,获得的Vector4就是移动后的坐标。后面的矩阵也都是这个原理,就不会再赘述了。

 

缩放矩阵:

Sx  0   0   0

0   Sy  0   0

0   0   Sz  0

0   0    0   1

 

x轴旋转矩阵:

1   0           0          0

0   cos(a)  sin(a)  0

0   -sin(a) cos(a)  0

0   0           0          1

 

y轴旋转矩阵:

cos(a)  0       -sin(a) 0

0          1       0           0

sin(a)  0       cos(a)  0

0          0       0           1

 

z轴旋转矩阵:

cos(a)  -sin(a) 0    0

sin(a)  cos(a)  0    0

0          0          1     0

0          0          0     1

 

以上就是常用的几个矩阵了。

 

四元数其实有点像是矩阵的效果,不过计算更加复杂难以理解,我这边参考了candycat的教程给出几个结论。

 

四元数的表示为(v, w),其中v类似是一个三维坐标。

 

单位长度的一个旋转轴(x, y, z)和角度a,则对应的四元数为((x, y, z)*sin(a/2), cos(a/2)) 。

 

创建四元数的几种方法:

Quaternion.Euler(Vector3)  以欧拉角创建四元数

Quaternion.AxisAngle(Vector3,float)  相对于某个方向旋转某个角度的四元数

Quaternion.FromToRotation(Vector3,Vector3)  起始方向到结束方向的四元数

Quaternion.LookRotation(Vector3)  朝向为正方向,旋转轴为上方向,旋转到想要方向的四元数

 

使用四元数:

operator*  四元数相乘,旋转累积

operator*  Vector3左乘四元数,点旋转到对应点

Lerp  线性插值

Slerp  球形插值

LerpUnclamped  非钳制线性插值,可以突破0和1的界限

SlerpUnclamped  非钳制球性插值,可以突破0和1的界限

 

欧拉角的旋转:

Transform.Rotate(Vector3)  就是transform的3个值,需要注意的是如果设置x为90度,则移动其他的纬度都会改变y,这就是万向节锁。

 

常用的方法估计就以上几个,如果后面有好用的方法,我还会再补充。

2016-08-31 23:18:37 lisheng1029 阅读数 401
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16447 人正在学习 去看看 姜雪伟

Unity3D开发之Matrix4x4矩阵变换

http://sygame.lofter.com/post/117105_3b843c/


在Unity开发中时常会用到Matrix4x4矩阵来变换场景中对象的位置、旋转和缩放。但是很多人都不太理解这儿Matrix4x4变换矩阵。通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么变换的。

在三维图形程序中,我们可以用几何变换来达到以下目的:

  • 表示一个对象相对于另一个对象的位置。

  • 旋转和安排对象的大小。


  • 改变视维、方向和透视方法。

  你可以使用一个4×4的矩阵将任何点变换到另一个点。下面的例子中,我们用一个矩阵对点(x, y, z)进行变化,产生了一个新的点(x', y', z'):

  对点(x, y, z)进行一下运算,会得到一个新点(x', y', z'):

  最常用的变换包括:平移(translation),旋转(rotation)和缩放(scaling)。你可以将这些变换合并起来,组成一个矩阵,同时进行几种变换。

矩阵以行列号的形式来描述。

沿每个坐标轴同时进行缩放时(我们称为统一缩放uniform scaling),矩阵如下所示:


下面的变化将一个点(x, y, z)平移到另一个点(x', y', z'):


下面的变换将一个点(x, y, z)沿x-轴进行旋转,得到了一个新的点(x', y', z'):


  下面的变化沿y-轴进行旋转:

  下面的变换沿z-轴进行旋转:

  这里要注意一点,希腊字母θ代表旋转的角度,用弧度来表示。从旋转轴向原点看,这个角度按顺时针方向来度量。


我们使用矩阵的一个最大好处就是可以通过矩阵相乘来将几个矩阵变换的效果合并起来。这就是说,当我们对一个模型进行旋转和平移时,不再需要用到两个矩阵。我们可以通过将旋转矩阵与平移矩阵相乘来得到一个合并的矩阵。这一过程就被称为矩阵级联,可以用下面的公式来表示:

  共识中,C指组合之后产生的新矩阵,M1Mn表示要组合在一起的每一个矩阵。一般情况下,我们指将两或三个矩阵组合起来,但实际上是没有限制的。  Matrix4x4类中有一个Matrix4x4.operator * 辅助函数来进行矩阵级联运算。  在进行矩阵级联时,我们应该注意级联时的顺序。上面公式 中反映的是一种从右到左的矩阵级联规则。也就是说,我们用来创建一个合并的矩阵的每个矩阵的实际效果是从右到左依次出现的。下面我们举一个例子来说明这一 情况。在这个例子中,我们要通过世界变换矩阵来创建一个“飞碟”。我们想要这个UFO沿中心(模型空间的y-轴)来旋转,同时要在场景中平移。为了达到这样的效果,你可以首先创建一个平移矩阵,然后用它和旋转矩阵相乘,如下所示:W=Tw·Ry  公式中,Tw表示平移矩阵,Ry表示旋转矩阵。  两个矩阵相乘的顺序是很重要的,与标量的相乘不同,矩阵相乘的顺序是不能交换的。如果我们将两个矩阵的顺序交换的话,得到的结果就会是,先对飞碟进行平移,然后将它绕世界原点进行旋转。  无论我们创建什么类型的矩阵,都要按照从右到左的顺序,这样才能达到我们预期的结果。




欢迎大家加入Unity技术交流群:3112035

                                                                                                                                                                                  ———— 大红花


2015-03-11 20:40:31 arbut 阅读数 1589
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16447 人正在学习 去看看 姜雪伟

前言:今天在项目中运用到了矩阵的旋转,于是就把矩阵的运算仔细查了一下,顿时觉得自己的离散、线代学的很差劲啊,矩阵也是3D数学中十分重要的基础,在Unity中,我们很多时候都会用到,掌握一下很有必要。

矩阵的概念:

m x nde 矩阵是一个具有m行、n列的矩形数组,行数和列数分别为矩阵的维度。在游戏引擎中使用的矩阵通常都是4 x 4矩阵,因为他可以描述向量的平移、旋转和缩放等所有的线性变换。

主要来看一下矩阵的旋转运算:

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述

以上就是矩阵的旋转变换,有点抽象,希望对你有帮助!

来自:博客园

2015-11-13 17:32:55 yxriyin 阅读数 2374
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16447 人正在学习 去看看 姜雪伟

      在游戏开发中,有些高级话题往往需要和矩阵扯上关系,例如阴影,迷雾,高级shader,发射等。这里简单说明下:

      1.矩阵虽然可能确实非常复杂,但对于学习应用的人来说,大可以把它理解成和加减乘除一样的一种运算,只不过它专门用于坐标转化。例如4*4矩阵,可以表达任何

三维空间中的旋转平移缩放。而Uniyt中的四元数,其实也是类似的功能,只不过简化了运算。

    

如果觉得看不懂,那就不要管了。反正就是那么回事吧。

        2.然后理解下空间的概念。首先是世界空间,这个很简单,就是你所在的这个大世界的空间,有一个坐标原点。然后就是视图空间,或者叫观察空间,就是以某一个人或者视点作为原点的空间。比如摄像头空间,其实应该就是视图空间。那么这个用来干嘛的呢?假设你是一个太阳,那么你照射物体,会有阴影,那么这个时候,以太阳作为原点的空间,进行各种计算是不是会方便些呢?答案是肯定的。所以你会发现很多时候,都会计算某一个视点的视图空间。

        视图空间的推导过程俺就不多说了,有兴趣的自己去看,http://www.cnblogs.com/graphics/archive/2012/07/12/2476413.html,总之就是你可以计算出一个矩阵,将世界坐标转成视图空间坐标。摄像头的世界坐标可以是各种各样,但视图空间里它就是原点。

        转化过程的物理意义就是:将摄像头放到原点,同时将转向调整成和世界坐标的朝向一致。

        3.有了这个矩阵后,我们就可以将世界坐标变成视图坐标了,还没结束呢,因为我们平时看的是在屏幕上啊,实际上是一个2d坐标系,那么怎么把3d坐标变成2d呢,这个就相当于投影,,我们需要来看一个新概念,叫投影矩阵。它的作用就是将3d坐标投射到屏幕上。投影分为两种,第一种正交投影,做法很简单,将z轴坐标改成视点原点即可。第二种透视投影,更接近人眼,具体推导过程有兴趣自己去看哈。http://blog.csdn.net/zhanghua1816/article/details/23121735。

    _Projector maps the x and y axis of the projector's clip space to u and v coordinates that are typically used for sampling a radial falloff texture.
_ProjectorClip maps the z axis of the projector's view space to a u coordinate (possibly duplicating it in v) that can be used to sample a ramp texture that defines the projector falloff with distance. The value of u will be 0 at the projector near plane and 1 at the projector far plane.

_Projector是将x,y从Project的裁剪空间映射到uv空间。所为裁剪空间,就是经过投影之后的平面空间。

   ProjectorClip则是将Project的视图空间转化到一张贴图中,表示该点距离Project的长度。


2019-11-07 11:11:53 Csoap2 阅读数 58
  • 3D数学在Unity中运用

    本课程主要是讲解3D数学知识在Unity中是如何运用?从坐标系到向量,矩阵,以及二叉树,行为树AI算法等知识讲解。将3D数学理论知识与实际开发结合起来。

    16447 人正在学习 去看看 姜雪伟
矩阵的定义

在Unity中,可以使用Matrix4x4.SetRow和Matrix4x4.SetColumn来设置一个4×4矩阵的某行或某列。
在Unity中,可以使用Matrix4x4.GetRow和Matrix4x4.GetColumn来获取一个4×4矩阵的某行或某列。结果为Vector4类型。
这里的index是从0开始。

矩阵和矩阵的加法/减法

只有维度相同的矩阵,才可以相加相减。
矩阵和矩阵的相加/相减即矩阵各相同位置的元素的相加相减。
在这里插入图片描述

矩阵和标量的乘法

矩阵和标量相乘,得到的仍然是一个相同维度的矩阵。矩阵和标量的乘法,即矩阵的每个元素和该标量相乘。
在这里插入图片描述
向量可以被当做一行或者一列的矩阵。3维向量可以看作是3×1矩阵,或是1×3矩阵。
矩阵和矩阵相乘时,只有满足第一个矩阵的列数和第二个矩阵的行数相等的条件时,才可以相乘。即r×n矩阵,才能和n×c矩阵相乘,得到的结果是一个r×c矩阵。
所以,向量与矩阵相乘时,行向量需要在左边,列向量需要在右边。

两个矩阵相乘的规则和矩阵和向量相乘的规则相同。
矩阵A和矩阵B相乘,得到的矩阵C中的任意元素Cij等于A的第i行向量与B的第j列向量的点乘结果。
在Unity中,可以使用Matrix4x4.operator *来进行矩阵和矩阵的乘法运算。
在这里插入图片描述

特殊矩阵

方块矩阵:行数和列数相等的矩阵被称为方块矩阵。
方块矩阵中,行号和列号相等的元素叫对角元素。
如果一个矩阵除了对角元素外的所有元素都为0,那么这个矩阵就叫做对角矩阵。

如果对角矩阵中的对角元素都为1,则这个对角矩阵被称为单位矩阵。
用任意一个矩阵乘以单位矩阵,都将得到原矩阵。
在Unity中,可以通过Matrix4x4.identity来获得一个4×4的单位矩阵。
在Unity中,可以通过Matrix4x4.isIdentity来判断一个矩阵是不是单位矩阵。
在Unity中,可以通过Matrix4x4.zero获得一个4×4的所有元素都为0的矩阵。

转置矩阵是对原矩阵进行转置运算后得到的矩阵。
一个r×c的矩阵转置后,可以得到一个c×r的矩阵。转置运算,即将原矩阵的第i行变为第i列,第j列变成第j行,也可以看作是沿着对角线翻折。
在Unity中,可以通过Matrix4x4.transpose获取一个矩阵的转置矩阵。
在这里插入图片描述

逆矩阵,只有方块矩阵才可能有逆矩阵,因为一个矩阵A和它的逆矩阵B需要满足条件:AB = I(I是单位矩阵)。
如果一个矩阵有相应的逆矩阵,则可以说这个矩阵是可逆的,或者说是非奇异的。如果一个矩阵没有相应的逆矩阵,则可以说这个矩阵是不可逆的,或者说是奇异的。
在这里插入图片描述
判断一个矩阵是否是可逆的,需要求得矩阵的行列式,如果它的行列式不为0,那么它就是可逆的。
二阶行列式的计算方法为对角线相乘相减。
在这里插入图片描述
三阶行列式的计算方法可以使用代数余子法,即行列式可以按某一行或某一列展开成元素与其对应的代数余子式的乘积之和。
行列式某元素的余子式:行列式划去该元素所在的行与列的各元素,剩下的元素按原样排列,得到的新行列式.
行列式某元素的代数余子式:行列式某元素的余子式与该元素对应的正负符号的乘积.
在这里插入图片描述

一个4×4矩阵的逆矩阵的求解方法如下:在这里插入图片描述
在Unity中,可以通过Matrix4x4.inverse来获取一个4×4矩阵的逆矩阵。
在这里插入图片描述

矩阵与变换

博文 来自: biezhihua
没有更多推荐了,返回首页