转换层次,递归函数问题

时间:2014-07-25 18:47:16

标签: java recursion graph transform hierarchy

我开始在我的Java / OpenGL项目中实现一个分层场景图,其中基本实体/对象具有位置组件,并且知道它们的父实体和它们的子实体。

public class Entity
{
  private Entity parent;
  private ArrayList<Entity> children = new ArrayList<Entity>();
  private Vector3f pos = new Vector3f(0,0,0); //simplified transformation

  addChild(Entity child){...}
  setParent(Entity parent){...}

  public Vector3f getPos(){ return pos; }
  public void setPos(Vector3f pos){this.pos = pos}

//this is my non-functional attempt at creating hierarchical movement
  public void setRelativePos(Vector3f pos) 
  {
    this.setPos(parent.getPos().add(pos)); //position relative to parent

    for(Entity child : children)
    {
        //how the child relatives to the newly moved parent
        vec3 relativePos = child.getPos().sub(getPos());
        child.setRelativePos(relativePos);
    }
  }

}

我的想法是,当父母的位置被改变/设定时,孩子会相对于父母移动。

1 个答案:

答案 0 :(得分:0)

根据您所描述的内容,我认为当您移动实体时,您希望移动其所有子项。

您的递归没有停止条件,可能会导致堆栈溢出。 它也有一个令人困惑的名字,setPos,这意味着一个简单的setter,但这不是它的作用。对于每种类型的移动,您应该有不同的方法。例如:翻译,旋转等......

你应该这样做:

// simple setter
public void setPos(Vector3f pos)
{
    this.pos = pos;
}

// translation movement
public void translate(Vector3f delta)
{ 
    // translate the current Entity
    setPos (getPos().add(delta));

    // translate the children
    for (Entity child : children)
        child.translate (delta);
}