摇杆四方向异速钳制下的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
相关产品推荐
相关产品推荐

