FPS伪重力玩家控制器:如何依据坡面方向调整滑行速度?
解决FPS伪重力控制器滑行的上下坡速度区分问题
核心思路
利用地形法线计算出地形的自然下坡方向,再通过角色移动方向与下坡方向的向量点积,判断当前是上坡还是下坡,以此动态调整滑行时的速度乘数:
- 下坡滑行:移动方向与下坡方向一致,点积为正,提升速度
- 上坡滑行:移动方向与下坡方向相反,点积为负,降低速度
- 平坡:点积接近0,保持原有速度逻辑
具体实现步骤
- 计算下坡方向向量:从地形法线中提取水平分量并取反,得到地形自然下滑的方向(假设垂直轴为Y轴)
- 获取角色水平移动方向:剔除角色移动方向的垂直分量,只保留地面平面上的移动方向
- 向量点积判断方向关系:点积结果范围为
[-1, 1],正数值表示下坡,负数值表示上坡 - 调整速度计算公式:将点积结果作为系数引入原公式,实现上下坡的速度差异化
代码示例(以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
相关产品推荐
相关产品推荐

