5. 设置重力加速度(下坡、坠落)
# 设置重力加速度(下坡、坠落)
上下课讲解了如何通过八叉树和胶囊碰撞体的计算,实现角色漫游上坡、上楼梯的功能。
这节课给大家讲解角色模型下坡、下楼梯或者从高处落下的问题。
# 判断人是否在站在物体表面
判断人是否在站在物体表面,比如是否站在低面或斜坡上,有支撑
const g = -9.8;//重力加速度
let personOnFloor = true;//表示人在物体表面上是否有支撑
function playerUpdate(deltaTime) {
// 每次更新发生移动,随时碰撞检测
const result = worldOctree.capsuleIntersect(capsule);
if (result) {
// 把交叉重合偏移回来
capsule.translate(result.normal.multiplyScalar(result.depth));
if (result.normal.y > 0) {
//交叉方向y朝上,说明有支撑
personOnFloor = true;
}
} else {
personOnFloor = false;//没有任何交叉,说明悬空,无支撑
}
}
# 根据重力加速度计算y方向速度
const g = -9.8;//重力加速度
let personOnFloor = true;//表示人在物体表面上是否有支撑
function playerUpdate(deltaTime) {
...
...
if (personOnFloor) {
v.y = 0;//y方向不管有无速度,直接归零
}else {//不在地面上(或者说没有支撑面)
// 根据重力加速控制玩家角色y方向速度
v.y += g * deltaTime;
}
}
# 悬空没有地面或物体表面阻尼
在实际生活中,人在在悬空状态下,没有地面明显的阻尼
if(personOnFloor){//人在物体表面才有阻尼
v.addScaledVector(v, damping);//阻尼减速
}
你可以通过测试,从高位置掉下来,悬空时候,是否考虑阻尼的下落差异。