對此,一個簡單而完美的解決方案是爲場景節點可以表示的所有各種事物建立接口/抽象基類。
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