我现在也想不起来这块代码有什么需要注意的地方.
原理非常简单,M2记的是关键帧动画,MESH顶点按时间在相临的两个关键帧的通过线性插值得到.这种关键帧动画例子对于第一次学习模型动画的人来说是个好的入门资料.
上个图:
工程用的VC6的基于对话框的框架.通过timer来作为动态刷新场景.渲染API用的OpenGL.
代码不够简洁,写的不漂亮.纯学习用尚可.
主要功能在COpenGlWnd类中
class COpenGlWnd : public CWnd
{
// Construction
public:
COpenGlWnd();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(COpenGlWnd)
//}}AFX_VIRTUAL
// Implementation
public:
int m_fps;
float m_lerp;
CPoint m_mousePos;
float m_xRot, m_zRot;
BOOL m_bCapture;
void SetLight(BOOL bOn);
void LoadSkin(char *skinname);
void LoadPCX (char *filename, byte **pic, byte **palette, int *width, int *height);
void SetPolygonMode(int value);
void LoadModal(LPCTSTR lszFileName);
void RenderScene();
BOOL Init_GL();
virtual ~COpenGlWnd();
// Generated message map functions
protected:
//{{AFX_MSG(COpenGlWnd)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnClose();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
HDC m_hDC;
HGLRC m_hRc;
GLuint m_texture;
stMd2Header m_Md2Header;
stMd2Skins *m_pSkins;
stMd2Triangles *m_pTriangles;
stMd2TexCoords *m_pTexCoords;
stMd2Frames *m_pFrames;
};
这个类基于CWnd,所以自然可以用作渲染窗口.
下面放上这个工程代码.没有用VC6以上的编辑器编译.所以要转换到VC6以上的IDE中肯定要修改部分.
http://files.cnblogs.com/Perit/MD2_Viewer-5.rar