首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的boids在匹配速度时会急于到达世界原点?

为什么我的boids在匹配速度时会急于到达世界原点?
EN

Stack Overflow用户
提问于 2013-06-04 16:52:56
回答 1查看 142关注 0票数 1

我在实现Conrad Parker's boids pseudocode时遇到了问题。

我正在实现rule1、rule2和rule3。问题是,只要rule3是活动的(即我下面代码中的matchSpeed ),boids就会冲到世界的中心(0,0,0),然后聚集在那个点周围。无论它们在世界上从哪里开始,都会发生这种情况。

但是当rule3没有运行时,boid就会像预期的那样聚集和漂移。我做错了什么?

我的代码是用Scala编写的,我使用的是jMonkeyEngine,但我怀疑这是一个一般性的问题。

代码语言:javascript
复制
  val sepDistance = 10f
  val clumpFactor = 100f
  val avoidFactor = 3f
  val alignFactor = 800f

  val speedLimit = 2f

  def moveAgents(target: Node)
  {
    agents.foreach(a => {
      a.velocity.addLocal(clump(a))        //rule1
      a.velocity.addLocal(keepAway(a))     //rule2
      a.velocity.addLocal(matchSpeed(a))   //rule3
      a.velocity = limitSpeed(a.velocity)
      a.move(a.velocity)
      })
  }

  def clump (a: Agent): Vector3f = // rule1
  {
    val centre = Vector3f.ZERO.clone
    for (oA <- agents if oA != a) yield 
      centre.addLocal(oA.position)

    centre.divideLocal(agents.length.toFloat - 1f)
    centre.subtractLocal(a.position)
    centre.divideLocal(clumpFactor)
    return centre
  }

  def keepAway (a: Agent): Vector3f = // rule2
  {
    val keepAway = Vector3f.ZERO.clone
    for (oA <- agents if oA != a) {
      if (Math.abs(oA.position.distance(a.position)) < sepDistance) 
        keepAway.subtractLocal(oA.position.subtract(a.position))
    }

    return keepAway.divide(avoidFactor)
  }

  def matchSpeed (a: Agent): Vector3f = // rule3
  {
    val matchSpeed = Vector3f.ZERO.clone
    for (oA <- agents if oA != a)
      matchSpeed.addLocal(oA.velocity)

    matchSpeed.divideLocal(agents.length.toFloat - 1f)
    matchSpeed.subtractLocal(a.position)
    matchSpeed.divideLocal(alignFactor)

    return matchSpeed
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-04 17:42:44

问题是matchSpeed方法从平均速度中减去了震源体的位置,而不是它的速度。

所以:

代码语言:javascript
复制
matchSpeed.subtractLocal(a.position)

应该是:

代码语言:javascript
复制
matchSpeed.subtractLocal(a.velocity)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16913524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档