“为什么不直接用cMesh对象绘出模型?”答案是:memory usage(内存用法);要是你想反复利用同一个网格(mesh),那cObject就可以帮你解决:
class cObject { protected: cGraphics *m_Graphics; // cGraphics父对象 cMesh *m_Mesh; // 要绘出的网格 sAnimationSet *m_AnimationSet; // 动画设置 cWorldPosition m_Pos; // 世界方向 BOOL m_Billboard; // 是否启用公告牌标志 unsigned long m_StartTime; // 动画开始时间 // 更新框架位置和绘出网格 void UpdateFrame(sFrame *Frame, D3DXMATRIX *Matrix); void DrawFrame(sFrame *Frame); void DrawMesh(sMesh *Mesh);
public: cObject(); // 构造函数 ~cObject(); // 析构函数 // 创建和释放对象(可选择要设置的网格) BOOL Create(cGraphics *Graphics, cMesh *Mesh = NULL); BOOL Free(); //启用或禁用公告牌 BOOL EnableBillboard(BOOL Enable = TRUE); // 将一个对象附加到另一个对象框架中 // (当update被调用时将使这些矩阵组合) // Defaults to first frame found in mesh. BOOL AttachToObject(cObject *Object, / char *FrameName = NULL); // 对象的位置旋转缩放(分绝对和相对) BOOL Move(float XPos, float YPos, float ZPos); BOOL MoveRel(float XAdd, float YAdd, float ZAdd); BOOL Rotate(float XRot, float YRot, float ZRot); BOOL RotateRel(float XAdd, float YAdd, float ZAdd); BOOL Scale(float XScale, float YScale, float ZScale); BOOL ScaleRel(float XAdd, float YAdd, float ZAdd); D3DXMATRIX *GetMatrix(); // 返回对象矩阵 // 返回对象坐标信息 float GetXPos(); float GetYPos(); float GetZPos(); float GetXRotation(); float GetYRotation(); float GetZRotation(); float GetXScale(); float GetYScale(); float GetZScale(); // 返回缩放盒子和其半径 BOOL GetBounds(float *MinX, float *MinY, float *MinZ, / float *MaxX, float *MaxY, float *MaxZ, / float *Radius); // 设置要绘出的网格 BOOL SetMesh(cMesh *Mesh); // 设置新动画 (w/名称和开始引用的时间) BOOL SetAnimation(cAnimation *Animation, / char *Name = NULL, / unsigned long StartTime = 0); char *GetAnimation(); // 获得指向动画名称的指针 //在一个新的时间重放动画 BOOL ResetAnimation(unsigned long StartTime = 0); // 基于时间更新动画 并使用光滑(Smooth) BOOL UpdateAnimation(unsigned long Time, BOOL Smooth = TRUE); // 动画结束返回TRUE BOOL AnimationComplete(unsigned long Time); BOOL Update(); // 更新对象转换矩阵 BOOL Render(); //用世界转换绘出对象 }; |
cObject类可以让3-D对象在你的世界中做任何事情。你可以定位你的对象、设置新网格、让视线和对象在同一线上(公告牌)、设置和更新动画、附加到其他对象上、返回盒子和其半径。
要使用cObject工作,只需要实例化他,并给他一个先前装载过的mesh对象,然后你就可以定位对象和显示了,例子:
// g_Graphics 一个初始化过的 对象 // g_Mesh 已经被装载过的网格对象 cObject g_Object; g_Object.Create(&g_Graphics, &g_Mesh); g_Object.Move(100.0f, 50.0f, 100.0f); g_Object.Render(); |