我一直在尝试找到一个可以适应并用于我正在开发的游戏的防撞示例。它将用于模拟滑雪者的动作以避免山上的树木。我基于自主角色的转向行为的运动,并且有很多关于路径跟踪和聚集的好例子,但我找不到任何避免碰撞的好例子。 Nature of Code网站上有很棒的转向教程,但似乎涵盖了除避障之外的所有内容。
我从这里转换了代码,但它不能正常工作,因为碰撞是通过将障碍物中心投影到速度矢量上来找到的,而不考虑障碍物中心何时可能超出碰撞限制但圆仍然是碰撞。这是我改编的代码(用处理(基于Java)编写)。
// Method to update location
void update() {
// Update velocity
vel.add(acc);
// Limit speed
vel.limit(maxspeed);
loc.add(vel);
// Reset accelertion to 0 each cycle
acc.mult(0);
}
void obstacleAvoid() {
float checkLength = 30*vel.mag();
PVector forward,diff,ray,projection,force;
float dotProd,dis;
forward = vel.get();
forward.normalize();
ray = forward.get();
ray.mult(checkLength);
for ( int i = 0; i < obs.size(); i++ ) {
Obstacle ob = (Obstacle)obs.get(i);
diff = ob.pos.get();
diff.sub(loc);
PVector temp2 = forward.get();
temp2.mult(ob.r);
diff.sub(temp2);
dotProd = diff.dot(forward);
if ( dotProd > 0 ) {
projection = forward.get();
projection.mult(dotProd);
dis = PVector.dist(projection,diff);
if ( (dis < (ob.r + r)) && (projection.mag() < ray.mag()) ) {
ob.hit = true;
force = forward.get();
force.mult(maxforce);
if ( sign(diff,vel) == -1 ) { //CCW
force.set(force.y,-force.x,0);
}
else { //CW
force.set(-force.y,force.x,0);
}
force.mult(1-(projection.mag())/ray.mag());
force.limit(maxforce);
acc.add(force);
}
}
}
}
因此,为了帮助我,我想知道是否有人知道遵循自主角色的转向行为更好地做事 的任何完整的防撞示例。这个站点是本文的示例小程序,也是我希望看到代码的确切示例。遗憾的是,它没有附带代码,我尝试反编译它,但它只显示了主类,所以这不是很有帮助。如果有人有这个例子的代码或类似的东西,或者教程,我会非常感激。