织梦CMS - 轻松建站从此开始!

罗索

OpenGL控件

jackyhwei 发布于 2011-08-17 10:35 点击:次 
曾经做过一个项目,需求是通过输入一些参数来调整三维空间内的曲线形态,而且能交互的展示出来。刚开始做的时候我是用maya实现的,用表达式控制curve,而表达式则是由mel生成的。这样通过在mel中修改参数就可以达到目的了。
TAG:

曾经做过一个项目,需求是通过输入一些参数来调整三维空间内的曲线形态,而且能交互的展示出来。刚开始做的时候我是用maya实现的,用表达式控制curve,而表达式则是由mel生成的。这样通过在mel中修改参数就可以达到目的了。不过这样做弊端是显然的,操作过于复杂,即便是maya的高级用户想熟练的进行参数修改和调整恐怕也不太容易,毕竟中国的maya用户能够熟练驾驭mel脚本的人确实不多。再有就是依托maya的框架交互展示太臃肿了,总不能谁想实现这个功能就让人家装个maya吧。

当时对OpenGL只是有简单的了解,对MFC还算熟悉,然后就决定通过MFC的自定义控件集成OpenGL的功能。用了一周的时间,我实现了所有需求,而且我觉得通过自定义控件的方式实现在MFC框架中实现OpenGL的调用十分的方便。经常能在论坛里看到大家询问有关OpenGL的问题,有与MFC有关的,也有和MFC没有什么关系的,不过用这个框架确实相对容易一些,所以决定分享出来和大家一起看看。先贴张图吧:

熟悉maya的朋友应该能看出来右下角的视图是模仿maya三维场景的配色方案,其它视图是我为了加以区别所以调整了背景色。作四个视图一方面是模仿一般三维软件的四视图操作模式(当然我没实现正交视图),另一方面是展示了通过这种自定义控件的方式可以轻松实现OpenGL的视图组织。关于自定义控件的东西我在多篇博客中都有涉猎,我比较推荐通过这种方式实现特殊功能的控件,关于自定义控件的基本知识可以参看《自定义控件实现信号灯》一文。至于这个控件其实没有什么特别复杂的东西,其控件类的定义如下:

  1. class COpenGLCtrl : public CWnd  
  2. {  
  3.     DECLARE_DYNAMIC(COpenGLCtrl) 
  4.  
  5.     CDC* m_pDC;  
  6.     HGLRC m_hRC; 
  7.  
  8.     GLfloat m_glfViewPosX, m_glfViewPosY, m_glfViewPosZ,  //视点坐标  
  9.      m_glfTargetPosX, m_glfTargetPosY, m_glfTargetPosZ,//观察目标点坐标  
  10.      m_glfCamDirectX, m_glfCamDirectY, m_glfCamDirectZ,//相机朝向  
  11.      m_glfGridUnit;  
  12.     COLORREF m_clrBackgroud, m_clrGridAxse, m_clrGridLine; //背景网格的颜色  
  13.     int m_nLines; 
  14.  
  15. public
  16.  
  17.     enum { MS_LBBTN = 0, MS_MBBTN, MS_RBBTN }; 
  18.  
  19. public:  
  20.     COpenGLCtrl();  
  21.     virtual ~COpenGLCtrl(); 
  22.  
  23.     void        RegisterCtrlClass();  
  24.     void        SetSceneSize(GLsizei glsWidth, GLsizei glsHeight);  
  25.     void        InitOpenGL();  
  26.     void        RenderScene();  
  27.     COLORREF    GetBkgColor(){return m_clrBackgroud;}  
  28.     void        SetBkgColor(COLORREF clrBkg){m_clrBackgroud = clrBkg;} 
  29.  
  30. protected:  
  31.     virtual void PreSubclassWindow();  
  32.    
  33. public:  
  34.     afx_msg void OnPaint();  
  35.     afx_msg void OnDestroy();  
  36.     afx_msg void OnSize(UINT nType, int cx, int cy); 
  37.  
  38.     DECLARE_MESSAGE_MAP()  
  39. }; 

这个类的定义相对简单,其中InitOpenGL函数调用的是配置OpenGL的环境的通用代码,SetSceneSize的作用是调整视图窗口的相关参数,而RenderScene用作渲染场景。场景控制我采用的是gluLookAt函数,此例中没有实现场景的交互控制,只是展示了通过控件集成的最简单的效果,如果要实现控制只需交互调整gluLookAt的相关参数即可实现。

另外说明一点,我在《界面布局动态调整》一文中介绍了一种可以使界面布局根据对话框大小变化动态调整的方法,文章中提供的例子是集成在一个对话框中的。这次做的这个例子中我也实现了四个视图的动态调整,不过这回我做了一个拥有控件适配功能的对话框类CAutoFitDlg做基类,然后主对话框通过这个类来继承,这样做更符合面向对象的设计思路,使用适配控件的功能也更方便,项目实践中我也是采用这种方法。

我对OpenGL也不是很熟,对于OpenGL的相关基础知识我就不班门弄斧了,这个例子有兴趣的朋友可以自行下载,希望会对大家有所帮助。

(xianglitian)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201108/14865.html]
本文出处:blog.csdn.net/xianglitian 作者:xianglitian
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容