4. 阻尼(玩家角色逐渐减速停止)
# 阻尼(玩家角色逐渐减速停止)
继续上节课内容讲解,上节课以W键为例,给大家讲解了怎么通过WASD按键,给玩家角色模型加速,本节课给大家讲解,怎么设置阻尼,具体说,就是当没有WASD按键加速时候,玩家角色模型,会在阻尼作用下逐渐减速停止,就像地面上滚动的球逐渐停下来。
if (keyStates.W) {
//先假设W键对应运动方向为z
const front = new THREE.Vector3(0,0,1);
// W键按下时候,速度随着时间增加
v.add(front.multiplyScalar(a * deltaTime));
// 在间隔deltaTime时间内,玩家角色位移变化计算(速度*时间)
const deltaPos = v.clone().multiplyScalar(deltaTime);
player.position.add(deltaPos);//更新玩家角色的位置
}
# 设置阻尼减速
大家可以思考下,当你没有按下WASD的时候,怎么给运动的物体减速。
其实很简单,可以在渲染循环中,重复执行速度v
乘以一个小于1
的数值,这样重复多次执行以后,速度就会逼近0。比如v* (1 - 0.04) = v * 0.96
,多次循环乘以0.96(v*0.96*0.96*0.96...
),v
就会无限逼近于0。
const damping = -0.04;
function render() {
if (keyStates.W) {
...
}
// v*(1 + damping) = v* (1 - 0.04) = v * 0.96
// 多次循环乘以0.96(v*0.96*0.96*0.96...),v就会无限逼近于0。
// v*(1 + damping) = v + v * damping
v.addScaledVector(v, damping);//阻尼减速
requestAnimationFrame(render);
}
# 验证阻尼是否生效
把if (keyStates.W){}
里面玩家角色位置更新的代码,挪到外面,你可以发现,当按键W松开,玩家角色会慢慢停下来,原因很简单,虽然一直在执行速度*时间
更新玩家位置,但是在阻尼作用下,速度慢慢逼近0了,位移变化量自然逼近0。
// 用三维向量表示玩家角色(人)运动漫游速度
const v = new THREE.Vector3(0, 0, 0);//初始速度设置为0
const a = 12;//WASD按键的加速度:调节按键加速快慢
const damping = -0.04;//阻尼 当没有WASD加速的时候,人、车等玩家角色慢慢减速停下来
// 渲染循环
const clock = new THREE.Clock();
function render() {
const deltaTime = clock.getDelta();
if (keyStates.W) {
//先假设W键对应运动方向为z
const front = new THREE.Vector3(0, 0, 1);
if (v.length() < 5) {//限制最高速度
// W键按下时候,速度随着时间增加
v.add(front.multiplyScalar(a * deltaTime));
}
}
// 阻尼减速
v.addScaledVector(v, damping);
//更新玩家角色的位置 当v是0的时候,位置更新也不会变化
const deltaPos = v.clone().multiplyScalar(deltaTime);
player.position.add(deltaPos);
mixer.update(deltaTime);
renderer.render(scene, camera);
requestAnimationFrame(render);
}
render();