我一直试图找到一个避免碰撞的例子,我可以适应并用于我正在进行的游戏。它将用于模拟滑雪者的动作以避开山上的树木。我基于自主角色的指导行为的运动,并且有许多关于路径追踪和植绒的好例子,但我找不到任何好的避免碰撞的例子。 The Nature of Code网站提供了很棒的转向教程,但似乎涵盖了除了避障之外的所有内容。
我从here转换了代码,但它不能正常工作,因为通过将障碍物中心投影到速度矢量上而不考虑障碍物中心可能超出限制时发现碰撞碰撞但圆圈仍在碰撞。这是我改编的代码(用Processing(基于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);
}
}
}
}
所以为了帮助我,我想知道是否有人知道任何完整的碰撞避免示例,这些示例遵循自主角色的指导行为更好的方式。 This Site是论文的示例小程序,是我希望能看到代码的确切示例。可悲的是,没有代码可以带来它,我尝试反编译它,但它只是显示主类,所以这不是很有帮助。如果有人拥有此示例的代码或类似的代码或教程,我会非常感激。
答案 0 :(得分:1)
Craig Reynolds无法发布您感兴趣的applet的源代码。类似的源代码可以在OpenSteer的c ++中找到,由Reynolds维护。 Christian Schnellhammer和Thomas Feilkas致力于扩展雷诺兹原创论文。他们的论文被翻译成english,其中包含一个关于避障的部分。他们的工作源代码可在Java中找到。但是,我认为Shiffman的代码是一个很好的起点,听起来你已经非常接近你想要的了
我的第一个处理程序之一修改了Boids示例以模拟僵尸启示录。三角形追逐避开它们的圆圈。每个幸存者都会检查其视野中的其他僵尸,并在函数PVector panic(ArrayList infected)
中平均威胁的位置矢量。在那之后,这是一个负向加权新矢量并将其添加到幸存者的当前矢量中的问题,就像任何其他力量一样。类似的东西:
void flock(ArrayList uninfected, ArrayList infected) {
PVector sep = separate(uninfected); // Separation
PVector ali = align(uninfected); // Alignment
PVector coh = cohesion(uninfected); // Cohesion
PVector pan = panic(infected); // Panic
// Arbitrarily weight these forces
sep.mult(4.0);
ali.mult(1.0);
coh.mult(2.0);
pan.mult(-3.0);
// Add the force vectors to acceleration
acc.add(sep);
acc.add(ali);
acc.add(coh);
acc.add(pan);
}
如果您的滑雪者成功检测到障碍物,那么避免就是问题所在。为避让向量添加更强的权重,增加滑雪者可以“看到”与对象交互的半径,或者甚至向返回滑雪者最近点位置的对象添加方法可以解决您的问题。您还可以根据滑雪者到前方最近障碍物的距离添加减速度。
请记住,即使您感兴趣的小程序也不能完全避开障碍。我的解决方案可能并不完全是小程序中发生的事情,但通过玩弄确定滑雪者方向的力量,您可以实现非常相似(并且可能更好)的效果。
答案 1 :(得分:0)
在NEHE游戏开发网站上查看此链接:
在本教程中,您将学习 碰撞检测的基础知识, 碰撞响应,物理上 基于建模效果。本教程 更专注于如何碰撞 检测工作比实际 代码,虽然所有重要的 代码解释了。
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=30
使用c ++和win32 API完成。虽然您可以使用JOGL找到 Java端口的链接。
同时强>
尽管在c ++中,http://www.red3d.com/cwr/steer/
的源代码在http://opensteer.sourceforge.net/
可用。你检查过了吗?