对此,一个简单而完美的解决方案是为场景节点可以表示的所有各种事物建立接口/抽象基类。
class Texture
{
...
};
class Geometry
{
...
};
// etc
class SceneNode
{
public:
// The following return null by default but
// can be overriden by SceneNode subclasses
// to return interface pointers.
virtual Geometry* geometry()
{
return 0;
}
virtual Texture* texture()
{
return 0;
}
};
class Model: public SceneNode, public Texture, public Geometry
{
public:
// Override the functions of inherited interfaces
virtual Geometry* geometry()
{
return this;
}
virtual Texture* texture()
{
return this;
}
};
这实际上是高端3D软件包以某种形式呈现的方式。有了它,给定任何场景节点,你可以查询它是否支持特定的接口(例如纹理),然后通过它进行动画处理。
Maya和XSI可以做到这一点,但可以通过接口方法返回所有返回void *的接口,客户端必须相应地进行转换。然后他们创建隐藏所需转换的引用类型。
对于您的所有编程解决方案,您不需要始终采用经典的设计模式。将它们视为工具和建议,但始终要问哪种设计模式对于给定问题起作用并不总是会导致最直接的解决方案。你必须自己思考,但设计模式可以帮助你。
与COM设计相似的声音 – YeenFei 2010-06-25 06:05:31
XSI和Maya SDK实际上跟随着COM,而不是严格遵守MS的约定(例如:没有IUnknown接口,处理引用计数和铸造的包装等) – stinky472 2010-06-25 07:08:31
好的,那么你是什么基本上说是从'Geometry'派生的,它应该声明一个'virtual void update()',并为每个动画类型覆盖这个方法?我其实是想到了这一点,但是很可能我迷失在努力使一切“都是正确的方式”。谢谢! – bbtrb 2010-06-25 14:10:19