You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FPS伪重力玩家控制器:如何依据坡面方向调整滑行速度?

解决FPS伪重力控制器滑行的上下坡速度区分问题

核心思路

利用地形法线计算出地形的自然下坡方向,再通过角色移动方向与下坡方向的向量点积,判断当前是上坡还是下坡,以此动态调整滑行时的速度乘数:

  • 下坡滑行:移动方向与下坡方向一致,点积为正,提升速度
  • 上坡滑行:移动方向与下坡方向相反,点积为负,降低速度
  • 平坡:点积接近0,保持原有速度逻辑

具体实现步骤

  1. 计算下坡方向向量:从地形法线中提取水平分量并取反,得到地形自然下滑的方向(假设垂直轴为Y轴)
  2. 获取角色水平移动方向:剔除角色移动方向的垂直分量,只保留地面平面上的移动方向
  3. 向量点积判断方向关系:点积结果范围为[-1, 1],正数值表示下坡,负数值表示上坡
  4. 调整速度计算公式:将点积结果作为系数引入原公式,实现上下坡的速度差异化

代码示例(以Unity C#为例)

// 假设已获取到地形法线 terrainNormal,角色移动方向 characterMoveDir
// 1. 计算下坡方向(仅水平分量,归一化)
Vector3 downhillDir = -Vector3.ProjectOnPlane(terrainNormal, Vector3.up).normalized;
// 2. 获取角色水平移动方向(归一化)
Vector3 horizontalMoveDir = Vector3.ProjectOnPlane(characterMoveDir, Vector3.up).normalized;
// 3. 计算移动方向与下坡方向的点积
float slopeDirectionDot = Vector3.Dot(horizontalMoveDir, downhillDir);

// 4. 调整速度乘数:下坡时加速,上坡时减速
float speedMultiplier = ((slopeAngle * slopeDirectionDot) / 2250f) + 0.99f;
// 可选:限制乘数范围,避免上坡减速过度或下坡加速过猛
speedMultiplier = Mathf.Clamp(speedMultiplier, 0.95f, 1.05f);

// 应用速度调整
moveSpeed *= speedMultiplier;

逻辑说明

  • slopeDirectionDot的正负直接关联上下坡状态:正为下坡,负为上坡
  • 原公式中的slopeAngle乘以点积后,下坡时会增大乘数(大于0.99),上坡时会减小乘数(小于0.99),完美适配需求
  • 可选的Mathf.Clamp可以避免极端坡度下速度突变,提升手感

内容的提问来源于stack exchange,提问作者Zacattack Space

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:51:40