gpt4 book ai didi

java - 碰撞避免示例或帮助

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:18:02 27 4
gpt4 key购买 nike

我一直在努力寻找一个可以适应并用于我正在开发的游戏的防撞示例。它将用于模拟滑雪者的 Action 以避免山上的树木。我的运动基于自主角色的转向行为,并且有很多关于路径跟随和植绒的好例子,但我找不到任何好的避免碰撞的例子。 The Nature of Code网站上有很棒的转向教程,但似乎涵盖了除避障之外的所有内容。

我从 here 转换了代码但它并没有像它应该的那样工作,因为通过将障碍物中心投影到速度 vector 上来发现碰撞,而不考虑障碍物中心何时可能超出碰撞限制但圆仍在碰撞。这是我改编的代码(用 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是本文的示例小程序,​​也是我希望能看到其代码的确切示例。可悲的是,它没有代码,我尝试反编译它,但它只显示了主类,所以这不是很有帮助。如果有人有此示例或类似的代码或教程,我将不胜感激。

最佳答案

Craig Reynolds 无法发布您感兴趣的小程序的源代码。类似的源代码在 c++ 中可用,地址为 OpenSteer。 ,由 Reynolds 维护。 Christian Schnellhammer 和 Thomas Feilkas 致力于扩展雷诺的原始论文。他们的论文被翻译成english并包含一个关于避障的部分。他们工作的源代码可在 Java 中找到。 .不过,我认为 Shiffman 的代码是一个很好的起点,而且听起来您已经非常接近您想要的了

我的第一个处理程序修改了 Boids 示例以模拟僵尸末日。三角形追逐避开它们的圆圈。每个幸存者检查他们视野中的其他僵尸,并在函数 PVector panic(ArrayList infected) 中对威胁的位置 vector 进行平均。之后,就是对新 vector 进行负加权并将其像任何其他力一样添加到幸存者的当前 vector 中。像这样的东西:

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);
}

如果您的滑雪者成功检测到障碍物,那么回避就是问题所在。向回避 vector 添加更强的权重,增加滑雪者可以“看到”与对象交互的半径,或者甚至向对象添加一个方法来返回距离滑雪者最近点的位置,都可以解决您的问题。您还可以根据滑雪者到其前方最近障碍物的距离添加减速。

请记住,即使是您感兴趣的小程序也不能完全避开障碍物。我的解决方案可能与小程序中发生的情况不完全相同,但通过调整决定滑雪者方向的力,您可以获得非常相似(并且可能更好)的效果。

关于java - 碰撞避免示例或帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4295539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com