如何在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

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma