如何在MFC程序中使用Open Inventor

如何在MFC程序中使用Open Inventor 本文将介绍如何在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> 编辑CMFCViewerApp::InitInstance(),在函数中增加上: SoWin::init(""); 这行代码将初始化SoWin和Coin库,必须在调用任何Coin或SoWin函数之前调用这行代码。 2. 打开MFCViewerView.h文件,增加下列头文件列表(增加到预编译头文件-#ifdef/#pragma once/#endif 序列之后) #include <inventor> #include <inventor> 增加一个公共数据成员变量 SoWinExaminerViewer * viewer; SoWinExaminerViewer主要用于渲染我们的场景,以可以和显示的内容做交互式操作(像旋转物体,选择部分场景等) 3. 打开MFCViewerView.cpp文件,修改构造函数: CMFCViewerView::CMFCViewerView() { viewer = NULL; } 修改析构函数: CMFCViewerView::CMFCViewerView() { if (viewer != NULL) delete viewer; } 3.创建场景 我们希望当用户创建了一个新文档后(点击菜单File | New),新创建的窗口中会有一个OIV场景。 1. 打开MFCViewerDoc.h文件,在CMFCViewerDoc类定义之上增加下列代码: class SoSeparator; 这行代码主要是告诉编译器,我们要使用一个叫做SoSeparator的类。 2. 向CMFCViewerDoc类增加一个公共数据成员变量: SoSeparator *root; 这是我们场景的根节点。 3. 打开MFCViewerDoc.cpp文件,增加下列头文件: #include <inventor> #include <inventor> #include <inventor> #include <inventor> #include <inventor> 这些都是我们准备在场景中使用的节点,因此需要首先包含它们的头文件。 4. 修改函数OnNewDocument() BOOL CMFCViewerDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; root = new SoSeparator; root-&gt;ref(); SoMaterial *myMaterial; root-&gt;addChild(myMaterial = new SoMaterial); myMaterial-&gt;diffuseColor.setValue(1.0, 0.0, 0.0); root-&gt;addChild(new SoCone); SoSeparator * instructsep = new SoSeparator; root-&gt;addChild(instructsep); instructsep-&gt;addChild(myMaterial = new SoMaterial); myMaterial-&gt;diffuseColor.setValue(0.5, 1.0, 1.0); SoTranslation * instructtrans = new SoTranslation; instructtrans-&gt;translation = SbVec3f(-2.0f, 1.3f, 2.0f); instructsep-&gt;addChild(instructtrans); SoText2 * instructions = new SoText2; const char * str[] = { "Instructions for the MFCViewer tutorial", "", "Left mouse button = rotate", "Middle mouse button = move", "CTRL + middle mouse button = zoom", "Right mouse button = options" }; instructions-&gt;string.setValues(0, sizeof(str) / sizeof(char *), str); instructions-&gt;justification = SoText2::LEFT; instructsep-&gt;addChild(instructions); return TRUE; } 我们通过向根节点增加子节点来建立场景。请记住,OIV会自己删除所有的场景对象,因此这里不需要程序员记住这些对象的指针,在以后的时候删除它们。(事实上如果这样做将会发生内存错误)。OIV是通过一种叫做引用计数的技术来实现这个功能的。 5. 修改构造和析构函数,增加上下列代码: CMFCViewerDoc::CMFCViewerDoc() { root = NULL; } CMFCViewerDoc::~CMFCViewerDoc() { if (root) root-&gt;unref(); } 调用root-&gt;unref(),告诉OIV,我们已经不再使用根节点对象了。所以OIV将会自动删除根节点。 6. 打开MFCViewerView.cpp文件,增加上下列代码: #include <inventor> 修改函数CMFCViewerView::OnDraw(CDC* pDC): void CMFCViewerView::OnDraw(CDC* pDC) { CMFCViewerDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (viewer == NULL) { viewer = new SoWinExaminerViewer( m_hWnd ); viewer-&gt;setDecoration(FALSE); SoSeparator *root = GetDocument()-&gt;root; viewer-&gt;setSceneGraph(root); } } 上面的代码将WinExaminerViewer嵌入到CMFCViewerView窗口中,其中WinExaminerViewer四周的 Toolbar(即Decoration)是不显示的。 编译并执行此应用程序 www.openinventor.cn openinventor@gmail.com openinventor@126.com </inventor></inventor></inventor></inventor></inventor></inventor></inventor></inventor></inventor>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值