虚幻引擎 Cross Product 节点

Cross Product 的几何意义是求一个同时垂直于两个输入向量的新向量,在游戏开发中常被用来构建坐标系或进行精确的方向、运动控制。

下面就从直观的物理约束开始,到视觉效果的提升,再到精巧的转向功能定制,通过这三个递进的案例,带你学会 Cross Product 节点的完整用法。

🤖 完整使用案例一:斜坡运动约束

在游戏中让角色在斜坡上滑动,核心就是将运动向量分解为平行于斜坡垂直于斜坡两个分量。而实现这个的关键一步,就是通过 Cross Product 找到特定的方向向量

1. 明确关键变量

我们以角色在斜坡上滑动为例,需要用到两个关键向量:

  • Surface Normal (N): 斜坡表面的法线,代表垂直于斜坡的方向。

  • Movement Vector (M): 角色当前的移动方向向量。

2. 逻辑推导步骤

  1. 计算滑动方向:要求得沿斜坡滑动的方向向量 (Slide Direction),我们可以对 Movement Vector 和 Surface Normal 进行两次 Cross Product 运算。

    • 先用 Cross ProductCross1 = M × N

    • 再用 Cross ProductSlide Direction = Cross1 × N

  2. 限制滑动速度:完成方向计算后,只需将最终的 Slide Direction 向量归一化处理,再乘以预设的滑动速度,就能得到平滑可靠的斜坡运动效果。

🎬 蓝图实现步骤

  1. 在关卡蓝图中,通过 Get Player Pawn -> Get Actor Location 获取当前位置,并进行 Line Trace (射线检测) 获取撞击下的 Hit Normal (即表面法线 N)。

  2. 同时,获取 Get Input Axis Value (W/S方向键) 结合 Get Actor Forward Vector (角色的前向向量),构建出你的移动向量 M。

  3. 在图表上右键,输入 Cross Product 将两个节点拖出,并按照上述逻辑连接两次运算。

  4. 最终得到的 Slide Direction 就可以作为 Add Movement Input 节点的输入,让你拥有一个可以自由控制角色的斜坡体验。

数学原理即辅助

叉积运算的方向遵循右手定则,且运算顺序至关重要,顺序互换会得到相反方向的向量。在这个场景中,通过两次叉积,我们巧妙地得到了一个垂直于法线但又与原始移动方向对齐的纯切平面向量,这正是实现平滑滑动的数学基础。

✨ 完整使用案例二:材质副法线计算

在材质编辑器中,我们可以利用 Cross Product 实时计算切线空间的副法线(Binormal)。这在制作复杂材质效果时非常常用。

1. 明确关键变量

  • World Normal: 世界空间中的法线方向。

  • World Tangent: 世界空间中的切线方向。

2. 逻辑推导步骤

  • Cross Product 输入A:连接 World Normal 节点。

  • Cross Product 输入B:连接 World Tangent 节点。

  • 节点将自动输出符合右手定则的 World Binormal (世界空间副法线) 

🎬 材质实现步骤

  1. 在材质编辑器中,右键并搜索 World Normal 和 World Tangent 节点,将它们添加到图表中。

  2. 再次右键,搜索 Cross Product 节点并添加到图表中。

  3. 将 World Normal 节点的输出连接到 Cross Product 的输入A (A)。

  4. 将 World Tangent 节点的输出连接到 Cross Product 的输入B (B)。

  5. Cross Product 节点的输出就是计算好的 World Binormal,您可以将其连接到材质需要的地方(例如某些高级光照模型的输入端)。

计算即渲染原理

因为法线 N 和切线 T 组成了一个局部坐标系的 XY 平面。它们的叉积,N × T,就会产生垂直于这个平面的向量,即副法线 B。这相当于在一个切面上,通过两条相交的直线,精确找到了这个切面的“法线方向”,帮助我们建立更精确的光照模型

🚀 完整使用案例三:定制LookAt转向

某些特定场景无法直接使用默认的 “Find Look at Rotation” 节点,这时您就可以用 Cross Product 自己构建一个转向功能

1. 明确关键变量

  • Forward (F): 从指向目标的方向向量。

  • World Up (U): 世界空间的向上向量,通常为 (0, 0, 1)

  • Right (R): 计算出的向右方向向量。

  • True Up (T): 最终真实的向上方向向量。

2. 逻辑推导步骤

  1. 计算 Forward (F),进行归一化。

  2. 用 Cross Product 计算 Right (R)Right = Up × Forward 并进行归一化

  3. 最后用 Cross Product 计算 True Up (T)True Up = Forward × Right 并进行归一化。

  4. 最后,用 F、R、T 这三个互相垂直的单位向量构建一个旋转矩阵,即可得到您想要的精确方向。

🎬 蓝图实现步骤

  1. 在角色蓝图的事件图表中,获取目标位置 Target Location,并与自身 Get Actor Location 进行减法运算,得到 Raw Forward

  2. 使用 Normalize 节点将 Raw Forward 归一化,得到 Forward (F)

  3. 定义世界向上向量 Up (U),使用 Make Vector 节点将其设为 (X=0.0, Y=0.0, Z=1.0)

  4. 添加 Cross Product 节点,将 Up (U) 连接到 A,Forward (F) 连接到 B,输出得到 Right (R) 并进行归一化。

  5. 再添加一个 Cross Product 节点,将 Forward (F) 连接到 A,Right (R) 连接到 B,输出得到 True Up (T)

  6. 最后,您可以将 F、R、T 三轴合成一个 Rotation 矩阵(通过 Make Rotation from Axes 节点),或直接设置角色的世界旋转,实现精确可控的面向方向。

💡 核心操作技巧速查表

  • 输入向量:节点仅操作3维向量,输入时需确保3个分量齐全

  • 运算顺序:叉积不满足交换律(A×B ≠ B×A),结果会完全相反。输出前请核对。

  • 向量归一化:为确保方向稳定,务必对输出结果使用 Normalize 节点进行归一化。

🔍 总结与拓展建议

  1. 选择你的舞台:根据你的应用场景,决定在以下哪种图中使用它:

    • 关卡蓝图 (Level Blueprint):控制场景物体,处理游戏逻辑。

    • 角色蓝图 (Character Blueprint):控制角色移动、相机。

    • Actor蓝图 (Actor Blueprint):包装特定的游戏物体。

    • 材质蓝图 (Material Blueprint):控制物体视觉外观。

  2. 实验与改进:在一个干净的测试场景中,连接并测试自己的蓝图。通过 Print String 打印向量值(如 Print (Cross Product))来验证输出方向是否正确。

  3. 高级探索:叉积还能用于计算机器人关节的扭矩、计算三角形面积实现水面波动等复杂视觉效果。您可以结合本回答的案例,在这些方向上进行更深入的学习。

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容