虚幻引擎 Vector Length Squared 节点

节点概述

Vector Length Squared 节点在虚幻引擎5中用于计算三维向量的平方长度(即模长的平方),数学表达式为 Length² = X² + Y² + Z²。该节点位于蓝图数学库的 Vector 类别中,属于 Kismet Math Library 的基础运算节点。

该节点的核心价值在于性能优化:传统的向量长度计算需要开平方根运算,而平方长度运算完全避开了昂贵的开根计算。当仅需要比较两个向量的长度关系(如判断哪个物体更近)时,直接比较平方长度即可得出相同结论


案例一:判断玩家是否进入特定半径范围

场景:游戏需要实时检测玩家是否进入敌人周围 500 单位的警戒范围。

数学原理:若不考虑高度,判断距离的公式为:

text
距离 = sqrt((PlayerX - EnemyX)² + (PlayerZ - EnemyZ)²)

若要判断距离是否 ≤ 500,需计算开方。优化方法为:

text
距离² = (dx)² + (dz)² ≤ 250000

即:比较平方值,无需开根

具体操作步骤

  1. 在关卡蓝图中右键,添加 Event Tick 节点(每秒检测多次);或在敌人蓝图中添加 Set Timer by Event 设置 0.1 秒循环检测。

  2. 获取玩家与敌人的位置向量

    • 添加 Get Actor Location 节点,目标设为玩家角色引用

    • 再添加一个 Get Actor Location 节点,目标设为敌人自身(Self

  3. 计算位移向量:添加 Vector - Vector 节点,用玩家位置减去敌人位置。

  4. 计算平方长度

    • 在输出引脚右键输入 Vector Length Squared,找到并添加该节点

    • 将位移向量连接到该节点的 A 输入引脚

    • 运行后将输出一个 Float(浮点数),即位移向量的平方长度

  5. 设定警戒半径阈值

    • 添加 float + float 节点,将警戒半径(500)自乘(500 × 500)得到阈值平方值 250000

  6. 进行比对:添加 <=(小于等于)节点,将平方长度和阈值平方值分别连接到左右输入。

  7. 执行逻辑

    • 将 <= 节点的输出连接到 Branch 节点的 Condition 输入

    • 若 True,执行敌人攻击或追踪逻辑

    • 若 False,执行闲置或巡逻逻辑

性能提示:此方法避免了每帧多次计算开平方根,在对大量对象进行距离检测时效果尤为显著。


案例二:攻击技能范围检测(球形区域)

场景:战士释放范围伤害技能,命中以自身为中心、半径 400 单位球形范围内的所有敌人。

具体操作步骤

  1. 准备数组:在技能蓝图中,创建一个 Get All Actors of Class 节点,目标类设为敌人类型(如 EnemyCharacter),输出为敌人数组。

  2. 遍历数组

    • 添加 For Each Loop 节点,遍历上一步获取的敌人数组

    • 在循环体内获取每个敌人的位置向量

  3. 获取战士位置:在技能蓝图中添加 Get Actor Location 节点,目标设为技能释放者(Instigator

  4. 计算位移向量:用敌人位置减去战士位置,得到位移向量

  5. 计算平方长度

    • 添加 Vector Length Squared 节点,输入为位移向量

    • 输出两个对象之间的平方距离

  6. 设定阈值:将技能半径 400 自乘,得到平方阈值(400 × 400 = 160000

  7. 判定命中:添加 <= 节点,将平方长度与平方阈值进行比对:

    • True:该敌人在技能范围内,应用伤害效果

    • False:跳过该敌人

  8. 闭合循环:循环结束后,处理命中效果逻辑(累计经验、触发动画、播放特效等)

扩展提示:如需对范围内的敌人按距离进行排序(例如优先治疗最近的队友),仅使用平方长度即可完成排序,无需任何开平方根运算


案例三:梯度场向量运算中的数据过滤(PCG)

场景:在程序化内容生成(PCG)中,需要从计算出的高度梯度向量场中剔除法线变化过小的区域,以避免在平坦地形上生成资源。

数学原理:此案例涉及向量场的标量分析。梯度向量反映地形高度变化的方向和幅度。梯度向量的平方长度直接代表了该区域法线变化的剧烈程度

具体操作步骤

  1. 构建梯度向量:使用 Make Vector 节点,将地形的法线分量(Normal XNormal YNormal Z)作为输入,构建地形法线向量

  2. 计算梯度幅度

    • 添加 Vector Length Squared 节点,输入为该法线向量

    • 输出值直接反映该点位的地形变化幅度

  3. 设定有效阈值

    • 使用 float * float 节点,将所需的最小法线变化幅度自乘,得到平方阈值

    • 例如:目标幅度 > 0.5,则平方阈值为 0.25

  4. 执行条件判断

    • 使用 `>“ 节点,将平方长度与平方阈值进行比较

    • True:该点位满足条件,进入资源生成逻辑

    • False:跳过该点位,继续下一个点位

应用优势:此方法可高效地从百万级顶点中筛选出有效点位,特别适合森林生成、植被分布等需要对大量数据进行距离比较的优化场景


额外建议

与其他节点的配合

节点 配合方式
Vector Length 当你需要最终输出实际长度时使用,会执行开根运算
Vector – Vector 计算两点之间的位移向量,是平方长度计算的前置步骤
Dot (Vector) 选择 A 与自身点乘,也可得平方长度(Vector · Vector = Length²

常见误区

  • 平方长度 ≠ 长度,它是长度的平方,因此在比较时需注意平方后的值变化(例如半径 1000 的平方是 1000000)

  • 平方长度的单位是平方单位(平方厘米),不应直接用于需要实际长度的计算(如移动速度、物理冲量)

  • 在控制着色器或材质中,若需要计算光源距离,可通过在材质蓝图编辑器中找到对应的数学运算节点实现。

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

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

昵称

取消
昵称表情代码图片

    暂无评论内容