unity3d 矩阵_mvp矩阵 unity3d - CSDN
  • Unity3D 旋转矩阵 顶点动画

    千次阅读 2017-09-09 10:58:13
    首先先看一下矩阵旋转公式 其中负责旋转的部分是负责缩放的部分是负责平移的部分是接下来我们来根据旋转的方式写一下旋转的方法using System.Collections; using System.Collections.Generic; using UnityEngine;...

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

    这里写图片描述

    这里写图片描述

    这里写图片描述

    其中负责旋转的部分是

    这里写图片描述

    负责缩放的部分是

    这里写图片描述

    负责平移的部分是

    这里写图片描述

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

    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 矩阵运算

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

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

    矩阵的概念:

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

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

    这里写图片描述

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

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

    来自:博客园

    展开全文
  • Unity3D矩阵运用

    2019-11-07 11:11:53
    Unity中,可以使用Matrix4x4.SetRow和Matrix4x4.SetColumn来设置一个4×4矩阵的某行或某列。 在Unity中,可以使用Matrix4x4.GetRow和Matrix4x4.GetColumn来获取一个4×4矩阵的某行或某列。结果为Vector4类型。 ...
    矩阵的定义

    在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矩阵的逆矩阵。
    在这里插入图片描述

    展开全文
  • 基本信息mul函数mul函数,是表示矩阵M和向量V进行点乘,得到一个向量Z,这个向量Z就是对向量V进行矩阵变换后得到的值。 HLSL的mul函数接受mul(V, M)或mul(M, V),要注意通常HLSL要依DirectX计算(V * M)使用mul(V, M)...

    基本信息

    mul函数

    mul函数,是表示矩阵M和向量V进行点乘,得到一个向量Z,这个向量Z就是对向量V进行矩阵变换后得到的值。
    HLSL的mul函数接受mul(V, M)或mul(M, V),要注意通常HLSL要依DirectX计算(V * M)使用mul(V, M)的形式.
    特别需要小心的是,V如果是float3,前后行列不等,违反HLSL规范,但shader编译也不报错,直接当成float4(V, 0)处理,而不是当成float4(V, 1).即mul(float3, M)中的float3被当成向量,而不是顶点.
    Unity3d 中,若是OpenGL,用的应该是GLSL,mul方法是(M,V)。

    矩阵

    内置的矩阵(float4x4):

    名称 说明
    UNITY_MATRIX_MVP 当前模型视图投影矩阵
    UNITY_MATRIX_MV 当前模型视图矩阵
    UNITY_MATRIX_V 当前视图矩阵
    UNITY_MATRIX_P 当前的投影矩阵
    UNITY_MATRIX_VP 当前视图投影矩阵
    UNITY_MATRIX_T_MV 模型视图矩阵的转置
    UNITY_MATRIX_IT_MV 模型视图矩阵的逆转置
    _Object2World 当前模型矩阵
    _World2Object 当前世界矩阵的逆矩阵

    这里要特别说明一下UnityObjectToClipPos(v.vertex)) 方法,官方网站上说明,在写Instanced Shader时,通常情况下并不用在意顶点空间转换,因为所有内建的矩阵名字在Instanced Shader中都是被重定义过的,如果直接使用UNITY_MATRIX_MVP,会引入一个额外的矩阵乘法运算,所以推荐使用UnityObjectToClipPos / UnityObjectToViewPos函数,它们会把这一次额外的矩阵乘法优化为向量-矩阵乘法。

    相机

    名称 类型 数值
    _WorldSpaceCameraPos float3 世界空间相机的位置
    _ProjectionParams float4 x = 1.0(或如果当前使用翻转投影矩阵渲染则为-1.0),y是相机的近平面,z是相机的远平面,w是1 / FarPlane
    _ScreenParams float4 x是相机的渲染目标在像素里的宽度,y是相机的渲染目标在像素里的高度,z是1.0 + 1.0 /宽度和w是1.0 + 1.0 /高度
    _ZBufferParams float4 用于线性化Z缓冲区的值。x(1-far /near),y(far/near)、z(x /far)和w(y /far)
    unity_OrthoParams float4 x是正交的相机的宽度,y是正交的相机的高度,z是未使用的,为正交的相机时w为1.0,透视相机时w为0.0
    unity_CameraProjection float4x4 摄像机的投影矩阵
    unity_CameraInvProjection float4x4 摄像机的投影矩阵的逆矩阵
    unity_CameraWorldClipPlanes[6] float4 相机锥平面世界空间方程,按顺序为:左、右、底部、顶部、近、远

    光照

    名称 类型 数值
    _LightColor0(Lighting.cginc中声明) fixed4 光照颜色
    _worldspacelightpos0 float4 方向光:(世界空间方向,0)。其他光:(世界空间位置,1)
    _LightMatrix0(AutoLight.cginc声明) float4x4 world-to-light矩阵。用于样品cookie 和衰减纹理
    unity_4LightPosX0、unity_4LightPosY0 unity_4lightposz0 float4 (仅ForwardBase通道)前四个不重要的点光源的世界空间坐标
    unity_4lightatten0 float4 (仅ForwardBase通道)前四个不重要的点光源的衰减系数
    unity_lightcolor half4[4] (仅ForwardBase通过)前四个不重要的点光源的颜色数组

    在Shader的光照通道里的延迟着色和延迟光照(在unitydeferredlibrary.cginc):

    名称 类型 数值
    _LightColor float4 光照颜色
    _LightMatrix0 float4x4 world-to-light矩阵。用于样品cookie 和衰减纹理

    多光源下,最多8个光源在顶点通道,排序为从最亮的开始

    名称 类型 数值
    unity_LightColor half4[8] 光照颜色数组
    unity_LightPosition float4[8] 视图空间光源的位置。方向光源的坐标是(-方向,0);(位置,1)用于点/点指示灯,点光源,聚光灯的坐标是(位置,1)
    unity_LightAtten half4[8] 光源衰减的系数。X是cos(spotAngle/2)或非聚光灯为-1;Y为1/COS(spotangle / 4)或非聚光灯为-1;Z是衰减的二次方;W是正方形光源的范围
    unity_SpotDirection float4[8] 视图空间聚光灯的位置;(0,0,1,0)则非聚光灯。

    基本变换

    在Unity中,每个物体都有一个坐标系,就是自身坐标系,各个物体之间相互独立。
    所有的物体都处在一个统一的空间里,这个空间就是世界空间,也有一个世界坐标系。
    把一个3D物体渲染到2D的屏幕上的基本流程以及每个变换对应的矩阵

    1. 因为物体的顶点坐标是基于自身坐标系的,所以渲染时,最先的变换是 模型空间——>世界空间,对应矩阵:_Object2World
    2. 物体要渲染到相机平面上实际上,是相机的可视区域内有哪些物体,也就是物体处于相机坐标系的本地坐标(localPosition)处于哪个位置。这个变换是 世界空间——>相机空间,对应矩阵:UNITY_MATRIX_V
    3. 此刻获取到了物体处于相机空间的位置,要把相机空间的所有信息都渲染到2维图片上,此刻需要进行投影变换,透视相机投影变换的目的是为了把视锥体转换为立方体,转换后,视锥体近平面的右上角点变成立方体前平面的中心,把视锥体较小的部分放大,较大的部分缩小,形成最终的立方体。变换后的x坐标范围是[-1, 1],y坐标范围是[-1, 1],z坐标范围是[0, 1](OpenGL不同,z值范围是[-1, 1]),这个变换是 相机空间——>投影空间,对应矩阵:UNITY_MATRIX_P

      通过UNITY_MATRIX_MVP 这个矩阵,可以把物体的顶点位置从模型自身坐标系转换到投影空间。
      对投影矩阵感兴趣的,可以自己搜索一下,整个推导过程需要一定的数学基础,理解就行。

      切线空间矩阵

      法线贴图大部分都是蓝色的,是因为法线贴图里存储的值都是Tangent Space(切空间)下的。
      在切线空间中,垂直于表面的法线向量是(0,0,1)。该向量转成像素是(0,0,127),这个值是蓝色的,由于大部分的数值都跟这个相差不会很大,也就是说,像素之间的差别并不是非常的明显,所以大部分都是偏蓝色。
      切空间(TBN)是表示物体模型上的顶点坐标位置随着纹理坐标(u,v)的变化而变化,该顶点切线空间的X轴方向是连接该点与下一个点坐标u的方向,该顶点切线空间Y轴方向是连接改点与下一个坐标v的方向,Z轴则是改点的法线方向。简单一点来说,也可以这么理解,该顶点的X轴就是该顶点的uv坐标系下的u轴,Y轴就是该顶点的uv坐标系下的v轴。
      其中

      T=(dxdu,dydu,dzdu)B=N×TN=T×(dxdv,dydv,dzdv)

      TBN切线空间矩阵M是[T,B,N]
      [T,B,N]=TxTyTzBxByBzNxNyNz

      如果三向量互相垂直,实际上也基本如此,Unity中,没有考虑其它情况。
      它的逆矩阵就等于它的转置矩阵。
      [T,B,N]1=TxBxNxTyByNyTzBzNz

      切线空间矩阵[T,B,N]的作用是为了把空间向量转换为切线空间里的向量。在做光照计算时,光源实在世界空间中,由于需要得到光线向量和法向量的夹角,而法线向量是在切线空间中,所以都是把一个转换到另外一个空间中,进行计算。
      有的是把光线向量转换到切线空间中进行计算,所以用到的基本上都是矩阵[T,B,N]的逆矩阵
      [T,B,N]1

      用它来乘以光照方向,得到光照在切线空间的转换。
      有的是把法线转换到世界空间进行计算,直接用矩阵来进行计算。
    展开全文
  • 一 四元数Quaternion中存放了x,y,z,w四个数据成员,可以用下标来进行访问,对应的下标分别是0,1,2,3。主要介绍几个函数<1> 根据两个向量计算出旋转量,计算出来的旋转量为从fromDirection旋转到toDirection的旋转...
  • 1:矩阵定义 矩阵是一个按照长方阵排列的复数或实数的集合。 向量的维度是看向量有几个分量。矩阵的维度则是看它有几行、几列。一个r×c矩阵有r行,c列。即2×3矩阵有2行3列。3×2矩阵则有3行2列。 在一个m×n的...
  • 矩阵 矩阵就是一行和列组织起来的矩形数字块。 矩阵可以理解为是向量的数组。 矩阵的维度和记法 矩阵的维度是包含多少行多少列!例如1行2列的矩阵 记法:矩阵m中,对于第1行第2列的元素,我们记为m12 方阵...
  • 矩阵与变换
  • 版本:unity 5.4.1 语言:C#   2017年了,使用Unity也有一段时间了,略有心得吧,基本上要求一些功能可以拼拼凑凑地做出来,算是入门了吧。   不过很多游戏上使用的技术还没有接触过,比如protobuf、热更新、...
  • 转自:...通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么变换的。在三维图形程序中,我们可以用几何变换来达到以下目的: 表示一个对象相对于另一个对象的位置。 旋转和安排
  • Unity变换矩阵之如何构建变换矩阵

    千次阅读 2017-12-24 15:50:32
    变换矩阵包括:平移、旋转、缩放。 平移矩阵: 旋转矩阵: 缩放矩阵: 变换矩阵,就是将一个向量一次进行 平移、旋转和缩放变换,由此可得变换矩阵为 应用: 1:进行向量的坐标系变换  已知模型空间下的...
  • 这个是博主的链接 添加一个在其他博客看到的: 最常用的变换包括:平移...你可以将这些变换合并起来,组成一个矩阵,同时进行几种变换。 矩阵以行列号的形式来描述。 沿每个坐标轴同时进行缩放时(...
  • unity shader——矩阵

    2018-09-24 19:48:30
    最近学unity shader时接触到了矩阵,这也是第一次了解矩阵,就稍微记录一下   一、什么是矩阵 1、首先,它长这样子: 2、它有着行列之分,上图就是3×4的矩阵(3行4列) 3、个人观点:其实矩阵的出现是为了...
  • UNITY中常用矩阵

    千次阅读 2017-08-17 14:44:37
    内置矩阵变量 含义 UNITY_MATRIX_MVP 当前模型视图投影矩阵 UNITY_MATRIX_MV 当前模型视图矩阵 UNITY_MATRIX_V 当前视图矩阵 UNITY_MATRIX_P 目前的投影矩阵 UNITY_MATRIX_VP 当前视图*投影矩阵 UNITY_...
  • Unity 3D--定义摄像机的投影矩阵

    千次阅读 2013-04-11 11:27:06
    Camera.projectionMatrix 投影矩阵 如果你改变这个矩阵,相机的渲染不再基于它的...这个属性被Unity的水渲染使用来设置一个oblique projection 矩阵。使用自定义投影需要了解变换和投影矩阵。 using UnityEngine
  • Unity3d shader内置矩阵

    千次阅读 2014-01-03 10:34:14
    内置矩阵 支持的矩阵(float4x4): UNITY_MATRIX_MVP 当前模型视图投影矩阵 UNITY_MATRIX_MV 当前模型视图矩阵 UNITY_MATRIX_V 当前视图矩阵UNITY_MATRIX_P 目前的投影矩阵 UNITY_MATRIX_VP 当前
  • 首先创建一个Unity工程,克森把他命名为“Matrix of China”(中国的矩阵),基本配置如下图所示:   为了便于查找,让我们在 Assets 目录下新建三个文件夹,分别命名为“Scripts”、“Shader”、“Materials”...
1 2 3 4 5 ... 20
收藏数 4,668
精华内容 1,867
关键字:

unity3d 矩阵