我开始在我的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);
}
}
}
我的想法是,当父母的位置被改变/设定时,孩子会相对于父母移动。
答案 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);
}