2017-02-15 13:18:38 u012632851 阅读数 890
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

版本: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 阅读数 408
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

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 阅读数 1610
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

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

矩阵的概念:

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

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

这里写图片描述

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

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

来自:博客园

2015-11-13 17:32:55 yxriyin 阅读数 2408
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

      在游戏开发中,有些高级话题往往需要和矩阵扯上关系,例如阴影,迷雾,高级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的长度。


2017-09-09 10:58:13 BattleTiger 阅读数 1904
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

首先先看一下矩阵旋转公式

这里写图片描述

这里写图片描述

这里写图片描述

其中负责旋转的部分是

这里写图片描述

负责缩放的部分是

这里写图片描述

负责平移的部分是

这里写图片描述

接下来我们来根据旋转的方式写一下旋转的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Twist : MonoBehaviour {

    private Mesh mesh;

    private void Start()
    {
        //获取mesh  为了得到所有顶点
        mesh = GetComponent<MeshFilter>().mesh;
    }

    private void Update()
    {
        //将顶点坐标存入到数组中
        Vector3[] vectors = mesh.vertices;
        //新建一个数组存取旋转后的顶点坐标
        Vector3[] results = new Vector3[vectors.Length];
        //设置一个旋转角度
        float angle = Input.GetAxis("Horizontal") * Time.deltaTime * 100;

        for (int i = 0; i < vectors.Length; i++)
        {
            //因为直接给angle 所有点旋转角度一样 所以*上vectors[i].y
            //这个是调用围绕Y轴旋转
            results[i] = DoTwistY(vectors[i], angle * vectors[i].y);
        }
        //将旋转后的顶点坐标再赋值给mesh的顶点
        mesh.vertices = results;

    }

    //围绕着X轴旋转
    Vector3 DoTwistX(Vector3 Position, float angle)
    {
        Vector3 result = Vector3.zero;
        float CosAngle = Mathf.Cos(angle);
        float SinAngle = Mathf.Sin(angle);
        result.x = Position.x;
        result.y = Position.y * CosAngle + SinAngle * Position.z;      
        result.z = -Position.y * SinAngle + CosAngle * Position.z;
        return result;
    }
    //围绕着Y轴旋转
    Vector3 DoTwistY(Vector3 Position,float angle)
    {
        Vector3 result = Vector3.zero;
        float CosAngle = Mathf.Cos(angle);
        float SinAngle = Mathf.Sin(angle);
        result.x = Position.x * CosAngle - SinAngle * Position.z;
        result.y = Position.y;
        result.z = Position.x * SinAngle + CosAngle * Position.z;
        return result;
    }
    //围绕Z轴旋转
    Vector3 DoTwistZ(Vector3 Position, float angle)
    {
        Vector3 result = Vector3.zero;
        float CosAngle = Mathf.Cos(angle);
        float SinAngle = Mathf.Sin(angle);
        result.x = Position.x * CosAngle + SinAngle * Position.y;
        result.y = -Position.x * SinAngle + CosAngle * Position.y;
        result.z = Position.z;
        return result;
    }
}

总结:
1.围绕着哪个轴旋转,哪个轴上的坐标就保持不变
2.第一行代表旋转后的x轴,第二行代表旋转后的y轴,第三行代表旋转后的z轴
3.第一列代表x轴,第二列代表y轴,第三列代表z轴
4.计算公式就是永远有的x,y,z乘上相对应的变化值相加变得出对应的轴的坐标

Unity3D之矩阵运用

阅读数 118

矩阵与变换

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