Java 避免碰撞示例或帮助

Java 避免碰撞示例或帮助,java,processing,collision,Java,Processing,Collision,我一直在试图找到一个避免碰撞的例子,我可以适应和使用的游戏,我的工作。它将用于模拟滑雪者的动作,以避开山上的树木。我以自主角色的转向行为为基础,有很多关于路径跟踪和群集的好例子,但我找不到任何关于避免碰撞的好例子。网站上有很棒的转向教程,但似乎涵盖了除避障之外的所有内容 我从中转换了代码,但它的工作效果并不理想,因为碰撞是通过将障碍物中心投影到速度向量上来发现的,而没有考虑障碍物中心可能在碰撞限制之外,但圆仍在碰撞。下面是我改编的代码(用Processing(基于Java)编写) //更新位置的

我一直在试图找到一个避免碰撞的例子,我可以适应和使用的游戏,我的工作。它将用于模拟滑雪者的动作,以避开山上的树木。我以自主角色的转向行为为基础,有很多关于路径跟踪和群集的好例子,但我找不到任何关于避免碰撞的好例子。网站上有很棒的转向教程,但似乎涵盖了除避障之外的所有内容

我从中转换了代码,但它的工作效果并不理想,因为碰撞是通过将障碍物中心投影到速度向量上来发现的,而没有考虑障碍物中心可能在碰撞限制之外,但圆仍在碰撞。下面是我改编的代码(用Processing(基于Java)编写)

//更新位置的方法
无效更新(){
//更新速度
添加级别(acc);
//极限速度
水平极限(最大速度);
位置加上(vel);
//每个循环将加速度重置为0
acc.mult(0);
}
无效障碍物无效(){
浮动校验长度=30*vel.mag();
PVector向前、差异、光线、投影、力;
float-dotProd,dis;
forward=vel.get();
forward.normalize();
ray=向前。get();
ray.mult(校验长度);
对于(int i=0;i0){
projection=forward.get();
projection.mult(dotProd);
dis=PVector.dist(投影,差异);
如果((dis<(ob.r+r))&&(projection.mag()

因此,为了帮助我,我想知道是否有人知道任何完整的避碰示例,它们遵循自主角色的转向行为,从而使事情做得更好。是本文的示例小程序,也是我希望能看到其代码的确切示例。遗憾的是,它没有附带任何代码,我试着对它进行反编译,但它只是显示了主类,所以这不是很有帮助。如果有人有这个例子的代码或类似的东西,或者有教程,我会非常感激。

在NEHE游戏开发网站上查看此链接:

在本教程中,您将学习 碰撞检测的基础知识, 碰撞响应,以及物理 基于建模效果。本教程 更多地关注碰撞是如何发生的 检测效果比实际效果好 代码,尽管所有这些都很重要 代码被解释

使用C++和Win32 API完成。尽管您可以使用JOGL找到Java端口的链接

同时
http://www.red3d.com/cwr/steer/
可在此处找到
http://opensteer.sourceforge.net/<代码> > C++。你检查过了吗?

克雷格·雷诺兹无法发布你感兴趣的小程序的源代码。类似的源代码在C++中是可用的,它由雷诺兹来维护。Christian Schnellhammer和Thomas Feilkas致力于扩展Reynolds的原始论文。他们的论文被翻译成并包含一个关于避障的章节。他们工作的源代码在中提供。然而,我认为希夫曼的代码是一个很好的起点,听起来你已经非常接近你想要的了

我的第一个处理程序修改了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);
}
如果你的滑雪者成功地发现了障碍物,那么回避就是问题所在。向避让向量添加更强的权重、增加滑雪者可以“看到”的半径以与对象交互,甚至向对象添加一种方法以返回距离滑雪者最近的点的位置,都可以解决问题。您还可以根据滑雪者到前方最近障碍物的距离增加减速


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

碰撞检测和响应!=避免碰撞。因为这个原因,你放在那里的NeHe链接实际上没有一个有效的答案。不过Opensteer是有效的。我正在调查Opensteer,看看是否能从中得到什么。我还考虑对物体的投影位置使用碰撞检测,这将给我一个投影向量,通常用于将物体从碰撞中投影出来,但也可以用作转向力。Metanet的这篇关于碰撞检测和响应的文章(我浏览了NeHe的文章,它看起来很相似)使它看起来很有希望。这种方法还允许使用比圆更有用的多边形。这是一个有效的选择吗?谢谢你的回复,扩展文件应该很有用。经过一段时间的胡闹之后,我意识到我可以使用基于投影的碰撞响应()作为指导力,并且能够得到满足我需要的好结果。结果
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);
}