原文http://blog.youkuaiyun.com/RobinHao/archive/2007/09/03/1770580.aspx
本文将介绍如何在MFC程序中使用Open Inventor(以下简称OIV)开发库。文中将使用VC 2003作为开发环境,使用SIM公司(www.coin3d.org)公司提供的Coin3D OIV作为Open Inventor开发库。关于OIV在Visual C++中的设置,请阅读网站 “Open Inventor-Coin3D开发环境” 中的内容。
1.创建工程
首先启动VC 2003,使用MFC Wizards创建一个MDI 应用程序(本文只讨论MDI类型的应用程序,但SDI或Dialog程序只需要稍微做一些修改,也是同样可以使用OIV的)。我们假定MDI应用程序的名称叫做“MFCViewer”。
2.增加Coin和SoWin代码
1. 打开MFCViewer.cpp文件,在文件开始部分增加下列头文件:
#include <Inventor/Win/SoWin.h>
编辑CMFCViewerApp::InitInstance(),在函数中增加上:
SoWin::init("");
这行代码将初始化SoWin和Coin库,必须在调用任何Coin或SoWin函数之前调用这行代码。
2. 打开MFCViewerView.h文件,增加下列头文件列表(增加到预编译头文件-#ifdef/#pragma on<wbr>ce/#endif 序列之后)<br> #include <Inventor/Win/SoWin.h><br> #include <Inventor/Win/viewers/SoWinExaminerViewer.h><br>增加一个公共数据成员变量<br>SoWinExaminerViewer * viewer;<br>SoWinExaminerViewer主要用于渲染我们的场景,以可以和显示的内容做交互式操作(像旋转物体,选择部分场景等)<br><br>3. 打开MFCViewerView.cpp文件,修改构造函数:<br>CMFCViewerView::CMFCViewerView()<br>{<br> viewer = NULL;<br>}<br>修改析构函数:<br> CMFCViewerView::CMFCViewerView()<br> {<br> if (viewer != NULL)<br> delete viewer;<br> }<br><br>3.创建场景<br>我们希望当用户创建了一个新文档后(点击菜单File | New),新创建的窗口中会有一个OIV场景。<br><br>1. 打开MFCViewerDoc.h文件,在CMFCViewerDoc类定义之上增加下列代码:<br>class SoSeparator;<br> 这行代码主要是告诉编译器,我们要使用一个叫做SoSeparator的类。<br>2. 向CMFCViewerDoc类增加一个公共数据成员变量:<br>SoSeparator *root;<br> 这是我们场景的根节点。<br>3. 打开MFCViewerDoc.cpp文件,增加下列头文件:<br>#include <Inventor/nodes/SoSeparator.h><br>#include <Inventor/nodes/SoMaterial.h><br>#include <Inventor/nodes/SoCone.h><br>#include <Inventor/nodes/SoTranslation.h><br>#include <Inventor/nodes/SoText2.h><br> 这些都是我们准备在场景中使用的节点,因此需要首先包含它们的头文件。<br><br>4. 修改函数On<wbr>NewDocument() <br>BOOL CMFCViewerDoc::On<wbr>NewDocument()<br>{<br>if (!CDocument::On<wbr>NewDocument())<br> return FALSE;<br><br>root = new SoSeparator;<br>root->ref();<br>SoMaterial *myMaterial;<br>root->addChild(myMaterial = new SoMaterial);<br>myMaterial->diffuseColor.setValue(1.0, 0.0, 0.0);<br>root->addChild(new SoCone);<br><br>SoSeparator * instructsep = new SoSeparator;<br>root->addChild(instructsep);<br><br>instructsep->addChild(myMaterial = new SoMaterial);<br>myMaterial->diffuseColor.setValue(0.5, 1.0, 1.0);<br><br>SoTranslation * instructtrans = new SoTranslation;<br>instructtrans->translation = SbVec3f(-2.0f, 1.3f, 2.0f);<br>instructsep->addChild(instructtrans);<br><br>SoText2 * instructions = new SoText2;<br>const char * str[] = {<br> "Instructions for the MFCViewer tutorial",<br> "",<br> "Left mouse button = rotate",<br> "Middle mouse button = move",<br> "CTRL + middle mouse button = zoom",<br> "Right mouse button = options"<br> };<br>instructions->string.setValues(0, sizeof(str) / sizeof(char *), str);<br>instructions->justification = SoText2::LEFT;<br>instructsep->addChild(instructions);<br><br>return TRUE;<br>} <br> 我们通过向根节点增加子节点来建立场景。请记住,OIV会自己删除所有的场景对象,因此这里不需要程序员记住这些对象的指针,在以后的时候删除它们。(事实上如果这样做将会发生内存错误)。OIV是通过一种叫做引用计数的技术来实现这个功能的。<br><br>5. 修改构造和析构函数,增加上下列代码:<br>CMFCViewerDoc::CMFCViewerDoc()<br>{<br>root = NULL;<br>}<br><br>CMFCViewerDoc::~CMFCViewerDoc()<br>{<br>if (root)<br> root->unref();<br>}<br> 调用root->unref(),告诉OIV,我们已经不再使用根节点对象了。所以OIV将会自动删除根节点。<br><br>6. 打开MFCViewerView.cpp文件,增加上下列代码:<br>#include <Inventor/nodes/SoSeparator.h><br> 修改函数CMFCViewerView::On<wbr>Draw(CDC* pDC):<br> void CMFCViewerView::On<wbr>Draw(CDC* pDC)<br> {<br>CMFCViewerDoc* pDoc = GetDocument();<br>ASSERT_VALID(pDoc);<br>if (viewer == NULL)<br>{<br> viewer = new SoWinExaminerViewer( m_hWnd );<br> viewer->setDecoration(FALSE);<br><br> SoSeparator *root = GetDocument()->root;<br> viewer->setSceneGraph(root);<br>}<br>}<br> 上面的代码将WinExaminerViewer嵌入到CMFCViewerView窗口中,其中WinExaminerViewer四周的 Toolbar(即Decoration)是不显示的。<br>编译并执行此应用程序<br><br><br><br><a href="http://www.openinventor.cn/" rel="nofollow">www.openinventor.cn</a><br><a href="mailto:openinventor@gmail.com" rel="nofollow">openinventor@gmail.com</a><br><a href="mailto:openinventor@126.com" rel="nofollow">openinventor@126.com</a></wbr></wbr></wbr></wbr></wbr></wbr>