Unity三渲二:数学基础

目录

一、矢量

1.什么是矢量

2.矢量的运算

2.1.矢量的加减

2.2.矢量和标量的乘除

2.3.矢量的模、单位矢量和归一化

2.3.1.矢量的模:

2.3.2.矢量的单位矢量:

2.3.3.矢量的归一化(normalization):

2.3.4.为什么要归一化?

2.4.矢量和矢量的乘法

2.4.1.点积(Dot product)

2.4.2.叉积(Cross product)

2.4.3.叉积的模

二、矩阵(Matrix)

1.什么是矩阵

2.矩阵的运算

2.1.矩阵和矩阵的加减

2.2.矩阵和标量的乘法

2.3.矩阵和矩阵的乘法

3.特殊矩阵

3.1.方块矩阵

3.3.对角矩阵

3.4.单位矩阵

3.5.转置矩阵

3.6.逆矩阵

3.7.正交矩阵

4.矩阵的几何意义:变换

4.1.什么是变换

4.2.变换类型

4.2.1.线性变换

4.2.2.仿射变换

齐次坐标

4.3分解基础变换矩阵

4.4平移矩阵

4.5缩放矩阵

4.6旋转矩阵

4.7复合变换


一、矢量

1.什么是矢量

矢量是一种既有大小又有方向的量,又称向量。

2.矢量的运算

2.1.矢量的加减

矢量的加减法遵循三角形定则

矢量的加法a+b=(ax+bx,ay+by,az+bz)

矢量的减法a-b=(ax-bx,ay-by,az-bz)

2.2.矢量和标量的乘除

即是矢量的每一个分量乘或者除以标量,可以乘除负数,则方向相反

矢量和标量的乘法:ab=(bax,bay,baz)

矢量和标量的除法:a/b=(ax/b,ay/b,az/b)

2.3.矢量的模、单位矢量和归一化

2.3.1.矢量的模:

矢量的模是一个标量,是矢量在空间的长度

二维矢量的模:a²+b²=c²

三维矢量的模:

2.3.2.矢量的单位矢量:

单位矢量就是归一化后模为1的矢量

二维空间:半径为1的单位圆,单位矢量从圆心出发,到圆边界的矢量

三维空间:单位矢量就是从一个半径为1的球心出发、到达球面的矢量

2.3.3.矢量的归一化(normalization)

把非零矢量转换为单位矢量的过程就是归一化(矢量)

矢量除以矢量的模

2.3.4.为什么要归一化?

归一化其实就是数据缩放,一种线性变换。为了数据处理方便,也能加快程序的运行。  在计算光照模型的时候我们往往关心的只是矢量的方向而不是模。

2.4.矢量和矢量的乘法

2.4.1.点积(Dot product)

又称内积,结果是一个标量,可能是负数也可能是零,经常用于计算光照模型,即对应分量相乘再求和。点积的几何意义很重要,其中一个几何意义就是投影

a.b=axbx+ayby+azbz

当两个矢量方向相同(即夹角<90°)时,点积大于0。

当两个矢量方向垂直(即夹角=90°)时,点积等于0。

当两个矢量方向相反(即夹角》90°)时,点积小于0。

两个矢量的点积也可以用模相乘乘以夹角的余弦,即:a.b=|a||b|cos夹角。

2.4.2.叉积(Cross product)

又称外积,结果会得到同时垂直于两个矢量的新矢量。常用于计算一个面的法线,也可以用来判断面是正面还是反面。

V1*V2=((y1*z2 – z1*y2,  z1*x2 – x1*z2,  x1*y2 – y1*x2))

注意:叉积不满足交换律和结合律,但满足反交换律,即a*b=-(b*a)。

2.4.3.叉积的模

叉积的长度等于两个矢量模相乘再乘以夹角的正弦值,即|a*b|=|a||b|sin夹角

注意:叉积不管是用左手坐标系还是右手坐标系,对于计算结果是不会产生影响的,只会影响在三维空间的视觉表现(比如当右手坐标系转换为左手坐标系时,计算结果不变,但是在渲染到屏幕上时,图像可能相反)

二、矩阵(Matrix)

1.什么是矩阵

一个矩阵可以把一个矢量从一个坐标空间转换到另一个坐标空间,从外观上就是一个长方形的网格,每个格子都放有一个数字。它是由m*n个标量组成的长方形数组。

只有一行的成为行矩阵,只有一列的成为列矩阵。

2.矩阵的运算

2.1.矩阵和矩阵的加减

前提:两个矩阵的行数和列数必须相同

对应位相加减

2.2.矩阵和标量的乘法

矩阵每一位都乘以标量

2.3.矩阵和矩阵的乘法

前提:矩阵和矩阵相乘时,只有满足第一个矩阵的列数和第二个矩阵的行数相等的条件时,才可以相乘。即r×n矩阵,才能和n×c矩阵相乘,得到的结果是一个r×c矩阵

相乘得到的结果矩阵的行数是第一个矩阵的行数,而列数是第二个矩阵的列数

注意:矩阵乘法一般不满足交换律,但一些特殊情况会存在,但满足结合律

3.特殊矩阵

3.1.方块矩阵

简称方阵,即行数和列数都相等的矩阵。

3.2.对角元素

方阵的对角元素指的是行号和列号相等的元素,比如M11、M22、M33

3.3.对角矩阵

如果一个方阵除对角元素外所有元素都为0,则这个矩阵叫做对角矩阵

3.4.单位矩阵

一个特殊的对角矩阵是单位矩阵,其对角元素都为1,且任何矩阵和它相乘结果都是原来的矩阵

MI=IM=M

3.5.转置矩阵

实际上是对原矩阵的一种运算,即转置运算。即将同号数的行转换为同号数的列

转置矩阵的一些性质:

3.6.逆矩阵

前提:该矩阵必须是一个方阵,但不是所有方阵都有逆矩阵(比如所有元素都为0的方阵)

最重要的性质:矩阵和矩阵的逆矩阵相乘为一个单位矩阵

如果一个矩阵有对应的逆矩阵,则说这个矩阵是可逆的,或者说是非奇异的。反之就是不可逆的,或者说是奇异的

3.7.正交矩阵

正交矩阵是一种特殊的方阵,如果一个方阵和它的转置矩阵的乘积是一个单位矩阵,则称这个矩阵是正交的。

即如果一个矩阵是正交的,那么它的转置矩阵和逆矩阵是一样的。          

4.矩阵的几何意义:变换

4.1.什么是变换

变换,指的是我们把一些数据(如点、方向矢量甚至是颜色等)通过某种方式进行转换的过程

4.2.变换类型

4.2.1.线性变换

线性变换指的是那些可以保留矢量和标量的变换(即可以保留矢量加和标量乘的变换,如缩放旋转错切镜像正交投影

对于所以的线性变换都可以用3x3的矩阵来表示

4.2.2.仿射变换

仿射变换就是合并线性变换和平移变换的变换类型,因为平移变换不包含于线性变换中,仿射变换就诞生了。

仿射变换可以用一个4x4矩阵来表示

为此,我们需要把矢量扩展到四维空间下,也就是齐次坐标空间

齐次坐标

3x3矩阵不能表示平移操作,就必须扩展到4x4矩阵,那么就必须三维矢量转换到四维矢量。

对于点,三维坐标转换为齐次坐标系,w分量设为1  

对于方向矢量,其w分量设为0

4.3分解基础变换矩阵

我们可以使用一个4x4的矩阵来表示平移、旋转和缩放,我们把表示纯平移、纯旋转和纯缩放的变换矩阵叫做基础变换矩阵

我们可以将这个基础变换矩阵分解成4个组成部分:

其中, 左上角的矩阵M 3 x 3 用于表示旋转和缩放, t 3x1 用于表示平移,0 1x3 是零矩阵, 即0 1 x 3 =[0, 0, 0],右下角的元素就是标量 1。

4.4平移矩阵

我们可以用矩阵乘法来表示对一个点进行平移变换

而向量没有位置属性,平移向量不应该对向量产生影响

平移矩阵的逆矩阵就是反向平移得到的矩阵,即

4.5缩放矩阵

我们可以对一个模型沿空间的x轴,y轴和z轴进行缩放,同样我们可以使用矩阵乘法来表示一个缩放变换。

对方向矢量可以使用同样的矩阵进行缩放,即

如果kx=ky=kz,则这样的缩放称为统一缩放,否则称为非统一缩放

缩放矩阵一般不是正交矩阵

4.6旋转矩阵

绕x轴旋转:

绕y轴旋转

绕z轴旋转

旋转矩阵的逆矩阵是旋转相反角度得到的变换矩阵,旋转矩阵是正交矩阵,而且多个旋转矩阵间的串联同样正交

4.7复合变换

我们可以把平移、旋转和缩放组合起来,形成一个复杂的变换过程。复合变换可以通过矩阵的串联来实现,且变换的结果是依赖于变换顺序的,又因为矩阵乘法不满足交换律,因此变换顺序很重要。

注意:大多数情况下,先进行缩放,再旋转,然后才是平移

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
抱歉,我是一个自然语言生成AI,并不具备生成link.xml文件的能力。不过,你可以按照以下步骤手动创建link.xml文件: 1. 在Unity项目的Assets目录下创建一个名为Editor的文件夹。 2. 在Editor文件夹下创建一个名为link.xml的文件。 3. 打开link.xml文件,在其中添加以下代码: ``` <linker> <assembly fullname="UnityEngine"> <type fullname="UnityEngine.Mathf" preserve="all"/> <type fullname="UnityEngine.Vector2" preserve="all"/> <type fullname="UnityEngine.Vector3" preserve="all"/> <type fullname="UnityEngine.Quaternion" preserve="all"/> <type fullname="UnityEngine.Collision" preserve="all"/> <type fullname="UnityEngine.RaycastHit" preserve="all"/> <type fullname="UnityEngine.Rigidbody" preserve="all"/> <type fullname="UnityEngine.Transform" preserve="all"/> <type fullname="UnityEngine.ThreadPriority" preserve="all"/> <type fullname="UnityEngine.Coroutine" preserve="all"/> <type fullname="UnityEngine.Delegate" preserve="all"/> <type fullname="UnityEngine.Events.UnityEvent" preserve="all"/> <type fullname="UnityEngine.AudioSource" preserve="all"/> <type fullname="UnityEngine.Video.VideoPlayer" preserve="all"/> <type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all"/> <type fullname="UnityEngine.Networking.UnityWebRequestAsyncOperation" preserve="all"/> <type fullname="UnityEngine.Networking.DownloadHandler" preserve="all"/> <type fullname="UnityEngine.Networking.DownloadHandlerBuffer" preserve="all"/> <type fullname="UnityEngine.Networking.DownloadHandlerTexture" preserve="all"/> <type fullname="UnityEngine.Networking.UploadHandler" preserve="all"/> <type fullname="UnityEngine.Networking.UploadHandlerRaw" preserve="all"/> <type fullname="UnityEngine.Networking.UploadHandlerForm" preserve="all"/> <type fullname="UnityEngine.Networking.DownloadHandlerAudioClip" preserve="all"/> <type fullname="UnityEngine.Networking.DownloadHandlerMovieTexture" preserve="all"/> <type fullname="UnityEngine.Networking.DownloadHandlerScript" preserve="all"/> <type fullname="UnityEngine.Networking.DownloadHandlerAssetBundle" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkTransport" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkClient" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkServer" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkManager" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkIdentity" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkBehaviour" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkMessage" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkReader" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkWriter" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkConnection" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkMigrationManager" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkLobbyManager" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkDiscovery" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkAnimator" preserve="all"/> <type fullname="UnityEngine.Networking.NetworkHash128" preserve="all"/> <type fullname="UnityEngine.ReflectionProbe" preserve="all"/> <type fullname="UnityEngine.Animator" preserve="all"/> <type fullname="UnityEngine.Playables.PlayableDirector" preserve="all"/> <type fullname="UnityEngine.Timeline.TimelineAsset" preserve="all"/> <type fullname="UnityEngine.Timeline.TimelineClip" preserve="all"/> <type fullname="UnityEngine.Timeline.TimelineTrack" preserve="all"/> <type fullname="UnityEngine.Rendering.CommandBuffer" preserve="all"/> <type fullname="UnityEngine.Rendering.RenderPipeline" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshAgent" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshObstacle" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshPath" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshData" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshHit" preserve="all"/> <type fullname="UnityEngine.AI.NavMesh" preserve="all"/> <type fullname="UnityEngine.AI.OffMeshLinkData" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshLinkData" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshLink" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshModifier" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshModifierVolume" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshQueryFilter" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshBuildSettings" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshBuildSource" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshBuildSourceShape" preserve="all"/> <type fullname="UnityEngine.AI.OffMeshLink" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshSurface" preserve="all"/> <type fullname="UnityEngine.AI.NavMeshDataInstance" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshQuery" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshAgent" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMesh" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshLink" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshModifier" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshSurface" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshData" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshDataInstance" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshQueryFilter" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshHit" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshPath" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.OffMeshLinkData" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshLinkData" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshBuildSettings" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshBuildSource" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshBuildSourceShape" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshCollectGeometry" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshCollectGeometryFilter" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshCollectGeometryModifier" preserve="all"/> <type fullname="UnityEngine.Experimental.AI.NavMeshLinkInstance" preserve="all"/> <type fullname="UnityEngine.Experimental.Rendering.RenderPipelineAsset" preserve="all"/> <type fullname="UnityEngine.Experimental.Rendering.RendererList" preserve="all"/> <type fullname="UnityEngine.Experimental.Rendering.RendererListDesc" preserve="all"/> <type fullname="UnityEngine.Rendering.Universal.ScriptableRendererData" preserve="all"/> <type fullname="UnityEngine.Rendering.Universal.ScriptableRendererFeature" preserve="all"/> <type fullname="UnityEngine.Rendering.Universal.ScriptableRenderPass" preserve="all"/> <type fullname="UnityEngine.Rendering.Universal.ScriptableRenderContext" preserve="all"/> <type fullname="UnityEngine.Rendering.Universal.ScriptableRenderer" preserve="all"/> </assembly> </linker> ``` 4. 保存link.xml文件并重新编译Unity项目。 以上代码会告诉Unity保留所需的程序集、类型和成员,而忽略未被引用的类型和成员。注意,这份link.xml文件并不是一份完整的文件,你可以根据实际需求进行添加/删除类型和成员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米芝鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值