- 音视频
- 图形学
- 桌面应用
【免费下载链接】t3
TiXL is an open source software to create realtime motion graphics.
导读
CrossVec3 是 TiXL(tooll3)开源实时动态图形软件中Lib.numbers.vec3库提供的一个基础数学运算符,它接收两个三维向量并计算它们的叉积(Cross Product)。本文以.help/docs/operators/lib/numbers/vec3/CrossVec3.md为骨架,结合其底层源码、项目定义文件与同库姊妹运算符(DotVec3、NormalizeVector3、RotateVector3 等),完整讲解 CrossVec3 的输入输出契约、数值计算原理、节点图连线方法,以及在实时视觉编程中求法线、判定朝向、构造旋转轴等典型应用,帮助你用叉积这一几何工具解决实时动效中的向量运算问题。
CrossVec3 在 TiXL 节点体系中的位置
CrossVec3 位于Lib.numbers.vec3运算符库,负责"对两个 Vec3 应用叉积"。它属于 TiXL 运算符系统中的原生(Native)实例节点,与其他 vec3 库运算符一同组成三维向量运算工具箱。从.help/docs/operators/lib/numbers/vec3/README.md可以看到该库涵盖的完整向量运算家族:
- 基础运算:AddVec3(相加)、SubVec3(相减)、ScaleVector3(缩放);
- 度量运算:Magnitude(长度)、Vec3Distance(两点距离)、DotVec3(点积)与本文主角CrossVec3(叉积);
- 变换运算:RotateVector3(绕轴旋转)、TransformVec3(矩阵变换)、MulMatrix(矩阵相乘);
- 插值与其他:LerpVec3、DampVec3、PerlinNoise3 等。
其中 DotVec3(点积)返回System.Single(标量),而 CrossVec3(叉积)返回一个新的三维向量,两者常常配合使用:点积衡量两向量的对齐程度,叉积则生成一个同时垂直于两个输入向量的新向量。
输入输出契约:参数与类型
原文档明确定义了 CrossVec3 的节点接口,其完整参数表如下:
输入参数
| 名称(相关度与类型) | 说明 |
|---|---|
| Input1(Vector3) | 叉积运算的第一个向量 |
| Input2(Vector3) | 叉积运算的第二个向量 |
输出
| 名称 | 类型 |
|---|---|
| Result | System.Numerics.Vector3 |
对照源码Operators/Lib/Symbols/numbers/vec3/CrossVec3.cs,三个端口的声明与文档完全一致:
[Input(Guid = "c88f66a4-8702-48ed-9693-29b3eac044f9")] public readonly InputSlot<System.Numerics.Vector3> Input1 = new InputSlot<System.Numerics.Vector3>(); [Input(Guid = "5d81821a-19d1-4961-b895-09c25f3f6afe")] public readonly InputSlot<System.Numerics.Vector3> Input2 = new InputSlot<System.Numerics.Vector3>(); [Output(Guid = "b5f83b5e-ed8c-47c4-bff2-c6f24651223d")] public readonly Slot<System.Numerics.Vector3> Result = new Slot<System.Numerics.Vector3>();两个输入与输出均使用System.Numerics.Vector3类型,即 .NET 系统自带的 3D 向量结构体。这意味着 CrossVec3 可以直接连接任何输出Vector3的运算符——包括 Vector3Gizmo(输出位置数据)、PerlinNoise3(输出噪声向量)以及同库的 AddVec3、ScaleVector3 等。
关于输入的默认值,项目定义文件Operators/Lib/Symbols/numbers/vec3/CrossVec3.t3显示两个输入的默认值均为(X: 0, Y: 0, Z: 0):
{ "FormatVersion": 3, "Id": "6cc830f0-cbc5-430d-9f32-1eab47b44693"/*CrossVec3*/, "Inputs": [ { "Id": "5d81821a-19d1-4961-b895-09c25f3f6afe"/*Input2*/, "DefaultValue": { "X": 0.0, "Y": 0.0, "Z": 0.0 } }, { "Id": "c88f66a4-8702-48ed-9693-29b3eac044f9"/*Input1*/, "DefaultValue": { "X": 0.0, "Y": 0.0, "Z": 0.0 } } ], "Children": [], "Connections": [] }由于零向量与任何向量叉积结果仍为零向量,实际使用时务必为 Input1、Input2 接入有效数据,仅靠默认值得不到有意义的输出。
底层实现:一次求值,一行叉积
CrossVec3 是纯计算型运算符,其核心逻辑集中在Update方法中:
public CrossVec3() { Result.UpdateAction += Update; } private void Update(EvaluationContext context) { Result.Value = Vector3.Cross(Input1.GetValue(context), Input2.GetValue(context)); }关键机制说明:
- 惰性求值与数据流:构造函数中把
Update注册到Result.UpdateAction,每当上游输入变化触发求值,TiXL 的求值引擎(EvaluationContext)就会驱动该更新链。Input1.GetValue(context)与Input2.GetValue(context)负责从上游节点拉取当前值,这正是 TiXL 节点图"连线即数据流"的底层工作方式。 - 一行完成运算:真正的计算委托给
System.Numerics.Vector3.Cross,这是 .NET 标准库自带的 SIMD 优化叉积实现,无需手动展开y1*z2 - z1*y2等分量公式。 Instance<CrossVec3>泛型基类:通过[Guid("6cc830f0-cbc5-430d-9f32-1eab47b44693")]在运算符系统中注册唯一身份,项目序列化文件(.t3/.t3ui)与源码即以此 Guid 相互关联,例如节点在编辑器中的连线布局保存在Operators/Lib/Symbols/numbers/vec3/CrossVec3.t3ui中。
与之形成对照的是同库的 DotVec3(Operators/Lib/Symbols/numbers/vec3/DotVec3.cs):它调用Vector3.Dot并输出Slot<float>(标量),证明两者虽同属 vec3 库、同为两个向量输入,但输出维度不同——这也是在图形节点中选择点积还是叉积的首要依据。
叉积的数学原理:右手定则与三维几何意义
对于三维向量a= (aₓ, aᵧ, a_z)、b= (bₓ, bᵧ, b_z),叉积定义为一个新向量:
a × b= (aᵧ·b_z − a_z·bᵧ, a_z·bₓ − aₓ·b_z, aₓ·bᵧ − aᵧ·bₓ)
CrossVec3 的Vector3.Cross正是这一公式的标准实现,其结果具有三个关键几何性质:
- 方向垂直:结果向量同时垂直于 a 与 b,可作为由 a、b 张成的平面的法线向量;
- 方向遵循右手定则:将右手四指从 a 弯向 b,拇指指向即为结果方向,因此叉积不满足交换律——
a × b = −(b × a),交换两个输入会得到方向相反的法线; - 长度蕴含信息:|a × b| = |a|·|b|·sin θ,其中 θ 为两向量夹角。当 a、b 平行或其中一个为零向量时,叉积为零向量(长度 0)。
借助 Magnitude(求长度)与 NormalizeVector3(归一化)两个同库节点,可以从叉积进一步提取夹角信息或单位法线,构成完整的几何计算链路。
在 TiXL 中的实战应用场景
结合Lib.numbers.vec3全库的能力,CrossVec3 在实时视觉项目中最典型的用法包括:
求平面法线(最常用):在三维场景中,给定三角形/平面上的两个边向量,将两个输入分别连入 CrossVec3 的 Input1、Input2,即可得到该平面的法线向量,用于光照方向、粒子发射朝向或相机朝向计算。若希望结果归一化,可在其后串联 NormalizeVector3。
判定朝向与"朝左/朝右":在俯视(XZ 平面)运动中,用"前方方向 × 上方方向(0,1,0)"得到侧向向量,可判断运动体的左右朝向;配合 DotVec3 的点积符号还能进一步区分"在前还是在后"。
构造旋转轴:叉积得到的法线向量可以直接作为 RotateVector3 的 Axis 输入(该节点提供 VectorA、Angle、Axis、Scale 四个输入),实现"绕由两向量决定的轴旋转"这一高阶变换。
生成垂直向量:当手头只有一个方向向量时,可与任意不平行的参考向量做叉积,快速生成一组正交基向量,用于程序化生成网格、粒子系统或轨迹偏移。
实时信号调制:由于 TiXL 的节点图每帧都会重新求值,叉积输入完全可以接 PerlinNoise3 等随时间变化的向量源,让法线/朝向结果随噪声实时抖动,从而把数学运算直接转化为视觉动效。
与其他 vec3 运算符的配合矩阵
| 组合方式 | 用途 | 相关文档/源码 |
|---|---|---|
| CrossVec3 → NormalizeVector3 | 将叉积结果归一化为单位法线 | .help/docs/operators/lib/numbers/vec3/NormalizeVector3.md |
| CrossVec3 → Magnitude | 由叉积长度求夹角信息(sin θ) | .help/docs/operators/lib/numbers/vec3/Magnitude.md |
| CrossVec3 → RotateVector3 | 以叉积结果作为旋转轴 | .help/docs/operators/lib/numbers/vec3/RotateVector3.md |
| AddVec3 → CrossVec3 | 由多个点构造边向量后再求法线 | Operators/Lib/Symbols/numbers/vec3/CrossVec3.cs |
| DotVec3 + CrossVec3 | 同时获得"对齐度(标量)"与"垂直向量" | .help/docs/operators/lib/numbers/vec3/DotVec3.md |
实操建议与常见陷阱
- 注意输入顺序:叉积遵循右手定则且非交换,交换 Input1、Input2 会导致结果方向反转。构造法线时,务必保证两输入按"从 a 到 b"的正确旋向连接,必要时可接入 ScaleVector3(系数设为 −1)修正方向。
- 警惕平行与零向量:两向量平行或任一输入为零向量时,叉积为零向量,后续归一化会失效。建议在关键路径上先校验输入非零。
- 默认值不可用:如
CrossVec3.t3所示,两个输入的默认值均为零向量,新建节点后必须先连线或手动设置有效值,否则输出恒为零向量。 - 类型匹配:CrossVec3 只接受
System.Numerics.Vector3,若上游是三个独立浮点数,需先用 Vector3Components 的逆向组合节点(或同类打包节点)组装成向量再接入。 - 与点积的分工:需要标量(如相似度、投影长度)用 DotVec3,需要向量(法线、旋转轴)用 CrossVec3,避免为求标量而错误使用叉积。
参考资料
- 运算符文档:.help/docs/operators/lib/numbers/vec3/CrossVec3.md
- 底层源码实现:Operators/Lib/Symbols/numbers/vec3/CrossVec3.cs
- 节点默认值与序列化定义:Operators/Lib/Symbols/numbers/vec3/CrossVec3.t3
- 编辑器界面布局定义:Operators/Lib/Symbols/numbers/vec3/CrossVec3.t3ui
- 同库运算符总览:.help/docs/operators/lib/numbers/vec3/README.md
- 音视频
- 图形学
- 桌面应用
【免费下载链接】t3
TiXL is an open source software to create realtime motion graphics.
相关推荐
TiXL 中的 MediaPipe 实时视觉运算符库(Lib.io.video.mediapipe)完全指南
TiXL 中的 MediaPipe 实时视觉运算符库(Lib.io.video.mediapipe)完全指南 TiXL(实时运动图形软件)在 Lib.io.vi
音视频图形学桌面应用TiXL 实时双向通信指南:Lib.io.websocket 的 WebSocketClient 与 WebSocketServer 运算符详解
TiXL 实时双向通信指南:Lib.io.websocket 的 WebSocketClient 与 WebSocketServer 运算符详解 本篇技术指南以
音视频图形学桌面应用Go-Money JSON序列化技巧:自定义Marshal和Unmarshal实现终极指南
Go Money JSON序列化技巧:自定义Marshal和Unmarshal实现终极指南 Go Money是一个基于Fowler's Money模式的Go语言
音视频图形学桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考