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

摇杆四方向异速钳制下的2D向量速度归一化计算方法

问题描述

我的目标是优化用户体验,确保摇杆斜向移动时光标的移动轨迹符合用户的直觉预期。


考虑这样一种场景:摇杆每个方向可配置的最大速度互不相同。
例如摇杆存在硬件缺陷,部分方向灵敏度过高、部分方向灵敏度不足,需要做灵敏度校正;或是游玩FPS游戏时,因上下视角转动需求较低,主动降低Y轴灵敏度。

各方向最大速度配置示例如下:

var map = {
    x: 100,
    y: 200,
}

摇杆输入为取值范围0到1的单位向量。
当前摇杆状态为向右偏移25%行程、向上偏移50%行程:

joystick = (dx: 0.25, dy: -0.50)

我目前不清楚后续该如何完成速度计算。

编辑:尝试@Caderyn提供的解决方案后的疑问

我尝试了@Caderyn提供的解决方案,实现代码如下:

var speeds = {
    x: 100, // X轴最大速度范围为-100到100
    y: 300, // Y轴最大速度范围为-300到300
}

var joystick = { dx: 2, dy: -3 }
console.log('joystick normalized:', normalize(joystick))

var scalar = Math.sqrt(joystick.dx*joystick.dx / speeds.x*speeds.x + joystick.dy*joystick.dy / speeds.y*speeds.y)
var scalar2 = Math.sqrt(joystick.dx*joystick.dx + joystick.dy*joystick.dy)
console.log('scalar1' , scalar) // 引入最大速度参数的长度计算公式
console.log('scalar2', scalar2) // 常规长度计算公式

// 基于最大速度做归一化处理
var normalize1 = { dx: joystick.dx/scalar, dy: joystick.dy/scalar }
console.log('normalize1', normalize1, length(normalize1))

// 常规归一化(不引入最大速度参数)
var normalize2 = { dx: joystick.dx/scalar2, dy: joystick.dy/scalar2 }
console.log('normalize2', normalize2, length(normalize2))

function length({dx, dy}) {
    return Math.sqrt(dx*dx + dy*dy)
}

function normalize(vector) {
    var {dx,dy} = vector
    var len = length(vector)
    return {dx: dx/len, dy: dy/len}
}

我是否遗漏了关键实现步骤?为什么该方案得到的计算结果,和完全不引入最大速度参数的常规vector.len()和vector.normalize()方法计算结果完全一致?


内容的提问来源于stack exchange,提问作者Blaine B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:01:07