上班了!好久没来汇报工作情况了。五一过的真累,但也挺开心。爸妈来上海一躺不容易,当然要好好陪着,累并快乐着!
这两天写了个多叉树的类SkeletonTree,用来组织骨骼数据结构。骨骼数据Frame_EX的设计这是借鉴了D3D中的D3DXFRAME,左子女右兄弟是关键,还有一个指向父节点的指针。这么设计的要点是非常容易递归调用,在更新骨骼数据时很管用。哎,做什么事情之前一定要充分调查,“没有调查就没有发言权”!如果路都走错了,再强的编程能力也是弥补不了的。
class Frame_EX : public ManipulatedFrame
{
public:
Frame_EX();
virtual ~Frame_EX();
public:
Frame_EX* Find(const char* name);
void UpdateHierarchy(CVector3D* pos = NULL, CQuaternion* ori = NULL);
void Reset();
public:
char* m_name;
Frame_EX* m_pFrameSibling;
Frame_EX* m_pFrameFirstChild;
CQuaternion m_oriCombined; //存储当前节点相对于根节点的旋转偏移四元数
CVector3D m_posCombined; //存储当前节点相对于根节点的位移偏移向量
CQuaternion m_oriOriginal; //保存骨骼的原始旋转四元数(相对于父节点)
CVector3D m_posOriginal; //保存骨骼的原始位移向量(相对于父节点)
};
class SkeletonTree
{
public:
SkeletonTree();
virtual ~SkeletonTree();
SkeletonTree(const SkeletonTree& sTree);
SkeletonTree& operator=( const SkeletonTree& sTree);
public:
const Frame_EX* rootFrame() { return m_root; }
bool empty() { return m_root == NULL; }
void InsertSibling(Frame_EX* pInsertAfter, const char* name);
void InsertChild(Frame_EX* pParent, const char* name);
Frame_EX* Find(char *name);
void DeleteNode(Frame_EX* pNode);
protected:
void DeleteNodeRecursive(Frame_EX* pNode);
private:
Frame_EX* m_root;
};
这个SkeletonTree类写的比较简单,只是应付一下当下的需要,还有很多地方可以扩展的,有待以后继续吧!把这些头文件列出,给他人一些借鉴的同时更希望得到大家的反馈,思想的交流才能碰撞出火花。