如何在MFC程序中使用Open Inventor

2024-05-08 10:18
文章标签 使用 程序 mfc open inventor

本文主要是介绍如何在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/Win/SoWin.h>  

编辑CMFCViewerApp::InitInstance(),在函数中增加上:                    
             SoWin::init("");
这行代码将初始化SoWin和Coin库,必须在调用任何Coin或SoWin函数之前调用这行代码。
2.         打开MFCViewerView.h文件,增加下列头文件列表(增加到预编译头文件-#ifdef/#pragma once/#endif 序列之后)
              #include <Inventor/Win/SoWin.h>
              #include <Inventor/Win/viewers/SoWinExaminerViewer.h>
增加一个公共数据成员变量
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/nodes/SoSeparator.h>
#include <Inventor/nodes/SoMaterial.h>
#include <Inventor/nodes/SoCone.h>
#include <Inventor/nodes/SoTranslation.h>
#include <Inventor/nodes/SoText2.h>
这些都是我们准备在场景中使用的节点,因此需要首先包含它们的头文件。
4.         修改函数OnNewDocument()     
BOOL CMFCViewerDoc::OnNewDocument()
{
 if (!CDocument::OnNewDocument())
    return FALSE;
 
 root = new SoSeparator;
 root->ref();
 SoMaterial *myMaterial;
 root->addChild(myMaterial = new SoMaterial);
 myMaterial->diffuseColor.setValue(1.0, 0.0, 0.0);
 root->addChild(new SoCone);
 
 SoSeparator * instructsep = new SoSeparator;
 root->addChild(instructsep);
 
 instructsep->addChild(myMaterial = new SoMaterial);
 myMaterial->diffuseColor.setValue(0.5, 1.0, 1.0);
 
 SoTranslation * instructtrans = new SoTranslation;
 instructtrans->translation = SbVec3f(-2.0f, 1.3f, 2.0f);
 instructsep->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->string.setValues(0, sizeof(str) / sizeof(char *), str);
 instructions->justification = SoText2::LEFT;
 instructsep->addChild(instructions);
 
 return TRUE;
} 
我们通过向根节点增加子节点来建立场景。请记住,OIV会自己删除所有的场景对象,因此这里不需要程序员记住这些对象的指针,在以后的时候删除它们。(事实上如果这样做将会发生内存错误)。OIV是通过一种叫做引用计数的技术来实现这个功能的。
5.         修改构造和析构函数,增加上下列代码:
CMFCViewerDoc::CMFCViewerDoc()
{
 root = NULL;
}
 
CMFCViewerDoc::~CMFCViewerDoc()
{
 if (root)
    root->unref();
}
                   调用 root->unref(),告诉OIV,我们已经不再使用根节点对象了。所以OIV将会自动删除根节点。
6.         打开MFCViewerView.cpp文件,增加上下列代码:
#include <Inventor/nodes/SoSeparator.h>
修改函数CMFCViewerView::OnDraw(CDC* pDC):
void CMFCViewerView::OnDraw(CDC* pDC)
                           {
 CMFCViewerDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (viewer == NULL)
 {
    viewer = new SoWinExaminerViewer( m_hWnd );
    viewer->setDecoration(FALSE);
 
    SoSeparator *root = GetDocument()->root;
    viewer->setSceneGraph(root);
 }
}
      上面的代码将WinExaminerViewer嵌入到CMFCViewerView窗口中,其中WinExaminerViewer四周的 Toolbar(即Decoration)是不显示的。
编译并执行此应用程序
www.openinventor.cn
openinventor@gmail.com
openinventor@126.com

这篇关于如何在MFC程序中使用Open Inventor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970049

相关文章

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建