【发布时间】:2019-10-30 17:09:21
【问题描述】:
我做了一个带有二次拖动的最小水平运动模拟器,可以找到here(用左右箭头键控制)。作为练习,除了施加力和阻力之外,我还尝试实施制动。它在按住空格键时起作用,但在释放后,盒子又开始以看似随机的方向低速移动。以下是我认为相关的代码:
let vt = 500 // terminal velocity
let amag = 1000 // magnitude of applied acceleration
let bmag = 1000 // magnitude of brake's acceleration
let drag = amag / (vt*vt) // coeffcient of quadratic drag
let x = 0 // horizontal position
let vx = 0 // horizontal velocity
function update(timestamp) {
let dt = ... // compute time delta from timestamp
// current acceleration
let ax = (keyStates.ArrowRight * amag) + (keyStates.ArrowLeft * -amag) - (keyStates[' '] * bmag * Math.sign(vx))
// forward euler method; solves (x'(t), vx'(t)) = (vx(t), ax(t) - drag * vx(t)^2)
x += dt * vx
vx += dt * (ax - Math.sign(vx) * drag * vx * vx)
}
【问题讨论】:
-
制动应该取决于速度(作为线性摩擦术语)(除非您使用某些火箭发动机主动制动)。如果汽车处于静止状态,则踩刹车不会产生任何加速度。
标签: javascript 2d game-physics differential-equations calculus