【问题标题】:Why do my boids rush to world origin when matching speed?为什么我的boids在匹配速度时会冲到世界原点?
【发布时间】:2013-06-04 08:52:56
【问题描述】:

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

我正在执行规则 1、规则 2 和规则 3。问题是,只要 rule3 处于活动状态(即下面我的代码中的 matchSpeed),boid 就会冲向世界的中心 (0, 0, 0),然后聚集在那个位置周围。无论他们从世界的哪个地方开始,都会发生这种情况。

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

我的代码在 Scala 中,我正在使用 jMonkeyEngine,但我怀疑问题是一般问题。

  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
  }

【问题讨论】:

    标签: scala boids


    【解决方案1】:

    问题在于 matchSpeed 方法从平均速度中减去焦点物体的位置,而不是它的速度。

    所以:

    matchSpeed.subtractLocal(a.position)
    

    应该是:

    matchSpeed.subtractLocal(a.velocity)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多