我正在尝试设计一个在我的物理引擎中使用的分层转换类。 首先,这是一个片段:
class Transform
{
public:
Transform();
~Transform();
private:
glm::mat3x3 local_to_world; // matrix of self and concatenated parents.
glm::vec2 w_translation; // only needed if the object uses hierarchy
glm::vec2 w_scale; // only needed if the object uses hierarchy
float w_rotation; // only needed if the object uses hierarchy
// the local coordinates of the root object are the same as its world coordinates.
glm::vec2 l_translation;
glm::vec2 l_scale;
float l_rotation;
Transform *parent; // only needed if the object uses hierarchy
Transform *root; // only needed if the object uses hierarchy
std::forward_list<Transform *> children; // you guessed it...
bool modified;
// an additional problem is that these functions are called after any
// update to the transform whatsoever, and are totally useless if the
// object is not using hierarchy
void update_w_trans();
void update_w_scale();
void update_w_rotation();
// ...
};
实际上,用户很可能只对少数几个对象使用父母。这意味着,对于任何不使用育儿的对象,都会有相当大的记忆和工作浪费。考虑到变换是一个非常常见的组件,我觉得这是一个大问题。
我想出了几个可能的解决方案:
将所有仅限层次结构的数据抛出到自己的结构中,并在类上保留指向该数据的指针。这需要在方法中进行 LOT 的空检查。
围绕包含变换指针的变换构建包装类。大多数方法都是一行,并在指针上调用方法,但是 如果调用一个会导致层次结构的方法(例如add_child),则进行一次转换为派生类。
我自己是一个相当缺乏经验的C ++ / OOP程序员,之前并没有真正遇到这样的问题,但我觉得这必须成为所有OOP的一个共同概念。
我想知道这些中的一个或两个是否是一种常用的方法,或者是否有更好的方法来解决这个问题,这样可以减少浪费,同时仍然保持界面简单?