Shader理论《七》相关的数学知识向量矩阵的运算

本文详细介绍了三维笛卡尔坐标系的基础知识,包括基矢量、左手坐标系与右手坐标系的区别,以及点和矢量的基本概念。此外,还探讨了矢量的各种运算,如点积和叉积的几何意义,并深入解析了矩阵及其运算,特别是正交矩阵的特点及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、笛卡尔坐标

上学的时候我们都学过二维坐标系,其实就是二维笛卡尔坐标系,所以没啥好说的,只是有一点要注意,OpenGL也就是Unity默认的坐标系是以左下角为原点,DirectX是以左上角为原点。如下图:

我们重点要面对的是三维笛卡尔坐标系,如下图:

3个坐标轴被称为该坐标系的基矢量,3个坐标轴互相垂直,长度为1,这样的基矢量被称为标准正交基,如果长度不为1,被称为正交基。当然,坐标轴方向也不是固定的,涉及到z轴向里为正还是向外为正,也就有了大家熟知的左手坐标系右手坐标系

虽然对开发者来说,左手和右手坐标系没有优劣之分,但我们要清楚当前平台的坐标系准则,不然空间运算就可能是错的,OpenGL是右手坐标系,DirectX是左手坐标系,而对于Unity,模型空间和世界空间是左手坐标系,向里为z轴正向,而观察空间,也就是以摄像机为原点的空间,用的是右手坐标系,摄像机前向是z轴负方向,注意观察空间是看不到的,只有计算中才能遇到。

2、点和矢量

点(point)是一个位置,没有大小的概念。二维坐标P = (X, Y),三维坐标P = (X, Y, Z)。

矢量(vector),也被称为向量,是空间中包含了模(magnitude)和方向(direction)的有向线段,比如速度。与之相对的是标量,只有模,没有方向,比如距离。

矢量的运算,假设矢量v = (x, y, z),各种运算如下:

1)矢量和标量的乘除

2)矢量的加减

它们的几何意义如图:

3)矢量的模

4)单位矢量

很多情况下,我们只关心矢量的方向而不是模。比如光照模型中,往往需要知道法线方向和光源方向,这种情况下我们不关心矢量有多长,这样就需要计算单位矢量。单位矢量指的是模为1的矢量,也被称为被归一化的矢量(normalized vector),而把非零矢量转换为单位矢量的过程被称为归一化。计算单位矢量公式如下:

5)矢量的点积

代码中用dot(a, b)来表示。

点积的几何意义

点积几乎用到了图形学的各个方面,其中一个就是投影。有一个单位矢量a和长度不限的矢量b。那么a与b的点积就是b在a方向上的有符号的投影。投影的结果是有符号的,如下图:

如果a不是单位矢量,那么a与b的点积等同于b在a上的投影,再乘以a的长度。

点积的几种数学公式:

下面要重点介绍点积的另一种表达式:

推导很容易,这里不加介绍。从这个公式可以看出两个向量的夹角对于点积结果的影响,小于90度为正,等于90度为0,大于90度为负。还可以用反余弦求出两个向量的夹角。

6)矢量的叉积

相信上学时都学过,这里直接上公式:

注意:

叉积的几何意义:

两个矢量叉积会得到一个同时垂直于这两个矢量的新矢量

我们知道两个方向互不平行的矢量可以确定一个平面,所以叉积最常见的应用就是计算垂直于一个平面的矢量,我们后面会在顶点法线,切线那里用到。


3、矩阵

如果还没把上学学的东西都还给老师的话,就跟我回忆一下吧。

矢量可以看成是nx1的列矩阵或1xn的行矩阵,其中n对应了矢量的维度。把矢量和矩阵联系在一起是为了让矢量像矩阵一样一起参与矩阵运算。这在空间变换中非常有用。

1)矩阵的运算

矩阵和标量的乘法:

矩阵和矩阵的乘法:

假设矩阵A的大小是4x2,B的大小是2x4,计算C = A x B,则C的大小是4x4。

其中:

也就是对应的行乘以对应的列。

矩阵乘法的一些表达式:

2)特殊矩阵

a、方块矩阵

简称方阵,就是行和列相等的矩阵。如果在方阵中除了对角线上的元素其他元素都是0,则成为对角矩阵。

b、单位矩阵

对角线元素都是1的对角矩阵就是单位矩阵。用 I 来表示。例如3x3的单位矩阵如下:

MI = IM = M

c、转置矩阵

d、逆矩阵

不是所有的矩阵都有逆矩阵,比如零矩阵,首先该矩阵必须是个方阵。M的逆矩阵表示为,它们满足一个公式:

如果一个矩阵有逆矩阵,我们就说它是可逆的或者非奇异的,相反则是不可逆的或奇异的。

逆矩阵的公式:

这里有个逆矩阵的几何意义,矩阵是可以表示变换的,逆矩阵则可以还原这个变换。比如用矩阵M对向量v进行了一次变换,如果我们想还原回v,只需要对变换结果乘以M的逆矩阵,公式如下:

f、正交矩阵

如果矩阵M和它的转置矩阵的乘积是单位矩阵的话,矩阵M就是正交的,公式为:

所以和上面的逆矩阵相比,我们发现:

这个公式很有用,因为求解一个矩阵的逆矩阵计算量很大,但转置矩阵很容易,所以如果我们知道该矩阵是正交矩阵,那用转置矩阵就可以当逆矩阵了。那如何判断一个矩阵是正交矩阵呢。用计算公式求解当然可以,但同样很麻烦,让我们看看它的几何意义。根据正交矩阵的定义,我们有:

我们可以把()当成M每一行和M转置每一列的向量,所以就有了等式:

我们从上面的等式中发现了些规律:

一、和自己点积的时候都为1,还记得向量和自己点积等于其模的平方的公式吧,不记得就再看看上面,模的平方为1,那模就是1,所以它们都是单位矩阵。

二、它们之间两两点积都得0,说明它们互相都垂直。

而这两个规律对每一列同样适用,因为M是正交矩阵,其转置也是正交矩阵。这两个规律说明什么,又是单位向量,又是彼此垂直,这不就是我上面提到的标准正交基吗。所以我们得出结论,正交矩阵的行与行之间,列与列之间分别构成了一组标准正交基。

这在空间转换中很有用,如果这些基矢量是一组标准正交基的话,那我们就可以直接用其转置矩阵来得到其逆矩阵了。

3)行矩阵还是列矩阵

我们都知道,向量是可以作为行矩阵或列矩阵的,本身没有区别,但和矩阵相乘就有区别了,因为我们要用到各种空间转换会用到向量与矩阵相乘。比如v代表的1x3的向量和M代表的3x3的矩阵相乘,如果vM那结果是1x3的矩阵,如果Mv(v变成列矩阵),那结果就是3x3的矩阵。我们往往需要的是后者,所以在Unity中,常规做法是把矢量放在矩阵的右边,即Mv。例如:

CBAv = (C(B(Av)))

表示先对v使用A变换,再用B变换,再用C变换,是从右往左的顺序。所以如无特殊情况,我们往往使用向量的列矩阵表达式。

<think>好的,用户现在问的是如何在物体坐标下使用向量数学节点进行运算。之前他们问过物体坐标系统的运算逻辑,所以这次的问题应该是进阶的应用问题。我需要先回顾之前的内容,确保这次回答的一致性。 首先,用户可能已经了解物体坐标系统的基本概念,现在想实际应用,特别是在材质节点中使用向量数学节点。他们可能在做纹理映射、动态效果或者复杂的材质调整,比如游戏模型或者动画中的效果。 我需要分步骤解释如何在Blender中配置物体坐标系统,然后结合向量数学节点。可能要从获取物体坐标开始,然后介绍向量数学节点的各种运算,比如加减乘除、点积、叉积等,再举几个实际例子,比如动态位移、纹理混合或者法线编辑。 还要注意用户可能的困惑点,比如坐标转换的顺序,参考物体的选择,以及向量运算对结果的影响。可能需要提醒他们注意空间转换,比如物体空间到世界空间的转换是否需要,以及如何通过节点连接来实现。 另外,用户可能希望有具体的节点截图或者示例,但作为文字回复,需要用清晰的步骤和示例来说明。比如,创建一个参考物体,在着色器编辑器中添加纹理坐标节点,选择物体坐标,连接到向量数学节点,再调整参数。同时,举例说明不同运算的效果,比如叠加噪声纹理或者旋转效果。 还要检查是否有遗漏的注意事项,比如缩放问题、参考物体的动画控制,或者性能方面的考虑。确保用户知道常见错误,比如忘记设置参考物体,或者向量方向不正确导致的错误结果。 最后,总结关键步骤和应用场景,帮助用户快速回顾。可能还需要提到高级应用,如结合脚本控制参考物体,或者与其他节点组合使用,增强灵活性。</think>在 Blender 中,**“物体”坐标系统**结合**向量数学节点**(Vector Math Node)的运算,可以实现复杂的纹理映射、几何变形或动态材质效果。以下是详细的操作逻辑和示例: --- ### **1. 基础配置** #### **步骤 1:获取物体坐标** 1. 在着色器编辑器(Shader Editor)中,添加 **`Texture Coordinate`** 节点。 2. 选择 **`Object`** 输出项(默认使用当前物体的坐标系,或指定外部参考物体)。 - 若需外部参考物体,需在节点属性面板中指定目标物体(例如一个空物体)。 #### **步骤 2:连接向量数学节点** 1. 添加 **`Vector Math`** 节点,将其输入端连接到 `Texture Coordinate` 节点的 **`Object`** 输出端。 2. 通过选择不同的 **运算模式**(如加、减、点乘、叉乘等),修改坐标值。 --- ### **2. 核心运算逻辑** 向量数学节点的作用是 **对坐标向量进行数学操作**,以下是关键模式和应用场景: | **运算模式** | **功能** | **应用示例** | |------------------|-------------------------------------------------------------------------|---------------------------------------| | **Add** | 向量相加,用于平移纹理或坐标偏移。 | 模拟动态位移(如水流移动)。 | | **Subtract** | 向量相减,用于反向偏移或对齐坐标系。 | 校准多个物体的纹理原点。 | | **Multiply** | 向量逐分量相乘,用于缩放纹理密度或方向性拉伸。 | 创建非均匀缩放的纹理效果。 | | **Dot Product** | 计算两向量的点积(标量结果),常用于光照或方向投影。 | 模拟法线方向的光照衰减。 | | **Cross Product**| 计算两向量的叉积(垂直方向向量),用于生成旋转或法线修正。 | 创建螺旋纹理或动态旋转效果。 | | **Length** | 计算向量长度(标量),可用于径向渐变或距离遮罩。 | 生成中心向外扩散的纹理。 | | **Scale** | 标量缩放向量,直接控制强度。 | 统一调整纹理缩放比例。 | --- ### **3. 实际案例** #### **案例 1:动态纹理平移** **目标**:通过空物体控制纹理的移动方向。 **节点链**: ``` [Texture Coordinate → Object] → [Vector Math (Add)] → [Noise Texture → BSDF] ``` **操作**: 1. 创建一个空物体作为参考物体。 2. 在 `Vector Math` 节点中选择 **`Add`** 模式,输入第二个向量(例如 `(0, 0, Time)`),通过空物体的位置驱动纹理沿 Z 轴动态移动。 #### **案例 2:法线方向扭曲** **目标**:根据物体坐标系扭曲法线方向。 **节点链**: ``` [Texture Coordinate → Object] → [Vector Math (Cross Product)] → [Normal Map] → [BSDF] ``` **操作**: 1. 使用 **`Cross Product`** 计算当前坐标向量与固定向量(如 `(0,1,0)`)的叉积,生成垂直于两者的新向量。 2. 将结果输入 `Normal Map` 节点,使表面法线按叉积方向扭曲。 --- ### **4. 高阶技巧** #### **结合多参考物体** - 通过多个 `Object` 坐标输入和向量运算,混合不同参考物体的坐标系。 **示例**: ``` [Object_A] → [Vector Math (Add)] [Object_B] → [Vector Math (Multiply)] → [混合结果] ``` 用于生成动态复合纹理。 #### **坐标系转换修正** - 若需从 **物体坐标系** 转到 **世界坐标系**: 1. 添加 `Object Info` 节点获取物体的世界矩阵。 2. 使用 `Vector Transform` 节点将局部坐标转换为世界坐标。 --- ### **5. 注意事项** 1. **参考物体的缩放问题**: 如果参考物体被缩放,需在 `Vector Math` 后添加 `Mapping` 节点反向修正缩放值。 2. **向量方向一致性**: 叉乘(Cross Product)的结果方向遵循右手定则,需注意轴向匹配。 3. **性能优化**: 复杂向量运算(如循环叉乘)可能增加渲染时间,建议优先使用 `Add`/`Multiply` 等轻量操作。 --- ### **总结** 在“物体”坐标系统下使用向量数学节点的核心逻辑是: 1. 通过 `Texture Coordinate` 节点获取参考物体的局部坐标。 2. 使用 `Vector Math` 节点对坐标进行数学操作,生成新的向量。 3. 将结果用于驱动纹理、几何或光照效果。 **优势**: - 动态控制:通过参考物体实现纹理或几何的实时交互。 - 数学自由度:支持任意向量运算,适合程序化生成复杂效果。 通过灵活组合参考物体和向量数学节点,可以高效实现如动态投影、坐标混合、物理模拟等高级材质效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

幻世界

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

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

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

打赏作者

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

抵扣说明:

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

余额充值