一、软件集成:C++调用Open Invetor 库函数显示3D点云

通过三维操作菜单进入数据采集的对话框部分

通过三维操作菜单进入点云显示(工程文件为SDIshow3D),读取Pts三维坐标点云文件

二、Coin3D与 Visual Studio 2008 配置

Coin3D 是一款免费的Open Inventor图形库,下载地址:http://www.coin3d.org

下表列出了Coin3D所包含的组件及其主要用途。其中绿色的部分为必装组件,黄色的部分需要根据不同的平台来选用,青色的部分为可选组件。对于Windows平台而言,必选的组件为Coin、SoWin和simage,Dime、Profit和Voleon可根据实际需要进行选择。


需要注意的是,Coin3D的每个组件都具有自己的版本号。这说明每个组件都是单独开发和演进的,各个组件之间在架构上是相互兼容的,并不要求组件之间的版本互相搭配。例如,Coin的3.1.2版本可以搭配SoWin 1.4.0,也可以搭配SoWin 1.5.0。这样,使得每个组件的最新版本都能得到及时地应用,也为用户提供了更多的灵活性。因此,Coin3D的每个组件都是单独发行的。提供安装包的做法,为用户提供了较大的便利,但也会“培养”用户的惰性,不会主动地更新各个组件的版本。所以,SIM选择了放弃了这种方式。

u  VS2008及Coin的安装

1)        安装好开发环境(VS2008)。

2)        把下载到的rar文件解压到目标文件夹(例如D:/Coin-3.1.3-bin-msvc9,以下称之为$(COINDIR))。解压后得到4个文件夹,建议放在C:\Coin3D目录下,以防出错。

3)        设置环境变量,如下图所示:

u  SoWin的安装:

第一步:解压,放到某个盘的根目录下(或其他目录),例如E:\SoWin-1.5.0.

第二步:找到E:\SoWin-1.5.0\build\msvc9目录,点击sowin1.sln,这是vs2008工程文件。打开后可以发现里面包含了4个项目。这时候别直接生成解决方案,第2关于文档的项目有错误,只要依次对第1,3项目生成解决方案即可。

u  VS2008的配置

(1)工具-》选项-》项目和解决方案-》VC++目录,选中“包含文件”,添加“$(COINDIR)\include”。

(2)将“配置”下拉到“所有配置”,项目-》属性-》C/C++ -》预处理器-》预处理器定义,添加COIN_DLL;SOWIN_DLL;两项内容。

(3)将“配置”下拉到“所有配置”,项目-》属性-》链接器 -》常规-》附加库目录,添加$(COINDIR)\lib。

(4)将“配置”下拉到“Debug”,项目-》属性-》链接器 -》输入-》附加依赖项,添加coin3d.lib sowin1d.lib。

(5)将“配置”下拉到“Release”,项目-》属性-》链接器 -》输入-》附加依赖项,添加coin3.lib sowin1.lib。

(6)在上述操作完成后,C:\Coin3D\bin目录下将会新增sowin1d.dll, sowin1.dll动态链接库。

u  测试

新建一个win32的测试程序(借用Coin3d公司网站上的一个程序),再根据以上设置完成之后,修改主程序至如下:

#include <Inventor/Win/SoWin.h>

#include<Inventor/Win/viewers/SoWinExaminerViewer.h>

#include<Inventor/nodes/SoSeparator.h>

#include <Inventor/nodes/SoCone.h>

Int main(int, char ** argv)

{

HWND window = SoWin::init(argv[0]);

if(window==NULL) exit(1);

SoWinExaminerViewer * viewer = new SoWinExaminerViewer(window);

SoSeparator * root = new SoSeparator;

SoCone * cone = new SoCone;

root->ref();

root->addChild(cone);

viewer->setSceneGraph(root);

viewer->show();

SoWin::show(window);

SoWin::mainLoop();

delete viewer;

root->unref();

return 0;

}

u  生成可执行文件

可选两种生成模式,调试为Debug,发布为Release。将生成后的exe文件以及以下dll文件置于同一目录下发布。

1)        bin/coin2.dll - the main Coinlibrary

2)        bin/sowin1.dll - the Win32 GUIlibrary

3)        bin/simage1.dll - for texturesupport

4)        msvcrt.dll - the MS CRTruntime, usually found in %SystemRoot%\System32

u  运行结果(生成圆锥体)

三、在MFC和Visual C++中使用Coin(单文档/多文档)

1、创建工程

启动VC6.0,创建新的工程,File | New | Projects | MFC AppWizard (exe)。假设工程名为"MFCViewer"。对向导使用默认配置,可以创建单文档或多文档程序。

2、为SoWin和Coin添加代码

u  打开MFCViewer.cpp文件。

包含头文件:

#include <Inventor/Win/SoWin.h>

编辑函数CMFCViewerApp::InitInstance(),在第一行中添加:

SoWin::init("");

上述用于初始化SoWin和Coin库,在使用这些函数库之前必须被调用。

u  打开MFCViewerView.h文件。

在预编译头之后(#ifdef/#pragmaonce/#endif sequence)添加包含文件:

#include <Inventor/Win/SoWin.h>

#include<Inventor/Win/viewers/SoWinExaminerViewer.h>

添加公共数据成员:

SoWinExaminerViewer * viewer;

ExaminerViewer用于渲染场景,且用于交互显示(旋转,选择部分场景等)

u  打开文件MFCViewerView.cpp。

1)       修改构造函数如下:

CMFCViewerView::CMFCViewerView()

{

viewer = NULL;

}

2)       修改析构函数 如下:

CMFCViewerView::CMFCViewerView()

{

if (viewer != NULL)

delete viewer;

}

3)       修改方法CMFCViewerView::OnDraw(CDC*pDC) 如下:

void CMFCViewerView::OnDraw(CDC* pDC)

{

CMFCViewerDoc* pDoc =GetDocument();

ASSERT_VALID(pDoc);

if (viewer == NULL)

{

viewer = newSoWinExaminerViewer( m_hWnd );

viewer->setDecoration(FALSE);

WINDOWPLACEMENT p;

memset(&p, 0,sizeof(p));

p.length =sizeof(WINDOWPLACEMENT);

p.showCmd =SW_SHOWMAXIMIZED;

SetWindowPlacement(&p);

}

};

这会将ExaminerViewer嵌入到CMFCViewerView窗口中。

4)       在窗口中加入可查看的形状

添加头文件:

#include <Inventor/nodes/SoSeparator.h> // remove me later

#include <Inventor/nodes/SoCone.h>      // remove me later

修改方法CMFCViewerView::OnDraw(CDC*pDC) 如下:

void CMFCViewerView::OnDraw(CDC* pDC)

{

CMFCViewerDoc* pDoc =GetDocument();

ASSERT_VALID(pDoc);

if (viewer == NULL)

{

viewer = newSoWinExaminerViewer( m_hWnd );

viewer->setDecoration(FALSE);

SoSeparator *root = newSoSeparator; // remove me later

root->addChild(newSoCone);          // remove me later

viewer->setSceneGraph(root);        // remove me later

}

}

3、创建一个场景

当用户创建新文档时(File |New),用于创建一个默认场景图。了解使用Coin创建一个场景。

u  打开文件MFCViewerDoc.h。

1)       添加类定义:

classSoSeparator;

这将通知编译器使用SoSeparator类。

2)       添加公共数据成员到CMFCViewerDoc class:

SoSeparator*root;

这是场景中的最高节点。

u  打开文件MFCViewerDoc.cpp。

1)       添加头文件如下:

#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>

2)       修改方法OnNewDocument()如下:

BOOLCMFCViewerDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

root = new SoSeparator;

root->ref();

SoMaterial *myMaterial;

root->addChild(myMaterial = newSoMaterial);

myMaterial->diffuseColor.setValue(1.0, 0.0,0.0);

root->addChild(new SoCone);

SoSeparator * instructsep = new SoSeparator;

root->addChild(instructsep);

instructsep->addChild(myMaterial = newSoMaterial);

myMaterial->diffuseColor.setValue(0.5,1.0, 1.0);

SoTranslation * instructtrans = newSoTranslation;

instructtrans->translation =SbVec3f(-2.0f, 1.3f, 2.0f);

instructsep->addChild(instructtrans);

SoText2 * instructions = new SoText2;

const char * str[] = {

"Instructions for the MFCViewertutorial",

"",

"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;

}

通过添加子节点到根节点来创建场景。Coin管理删除所有场景物体,所以不需要程序员去记住任何对象指针并删除它们(事实上,这样做是错误的)。这种技术通过引用计数与调用函数root->ref();以上可确保Coin不会尝试删除根节点或任何子节点。

3)       修改构造函数与析构函数如下:

CMFCViewerDoc::CMFCViewerDoc()

{

root = NULL;

}

CMFCViewerDoc::~CMFCViewerDoc()

{

if (root)

root->unref();

}

调用root->unref()来通知Coin不再使用根节点,Coin可以将其删除。

u  打开文件MFCViewerView.cpp。

1)       添加如下头文件:

#include<Inventor/nodes/SoSeparator.h>

2)       修改方法CMFCViewerView::OnDraw(CDC* pDC)如下:

voidCMFCViewerView::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);

}

}

修改OnDraw方法来获取文档对象的根场景

u  编译并运行项目。应用程序启动并打开一个窗口,显示出我们刚刚创建的场景图。

Open Inventor Coin3D相关推荐

  1. Coin3d环境搭建(VS2019+QT),实现基于Open Inventor机器人图形交互

    先下载VS2019下载 Visual Studio Tools - 免费安装 Windows.Mac.Linux (microsoft.com) 这里点下载然后界面拖到最下点击较早的下载项 下载这个2 ...

  2. VS2010 + QT 5 +open inventor 环境配置

    本科毕业设计做的是   随钻测量的井眼轨迹和测井曲线的三维显示  要求的环境是  QT +  Open Inventor    在寒假开学前,打算将环境配置好,开学后再正式编码实现,可是....环境也 ...

  3. Open Inventor 简介

    深入学习资料:http://blog.csdn.net/robinhao Open Inventor 简介 简介 Open Inventor(以下简称OIV)是SGI公司开发的基于OpenGL的面向对 ...

  4. Open Inventor: Windows系统下编译安装Quater

    Windows系统下编译安装Quater 济南友泉软件有限公司 一.工具安装 1.1 CMake CMake是一个用于生成不同平台下构建项目的工具.建议使用3.0版本之后的CMake.下载链接 1.2 ...

  5. Android在线开发工具 App Inventor

    最近在博客园看到一篇报道关于一个人好像是别出心裁的用android程序求婚,最后成功了,在留言部分看到很多园友说:好浪漫,好幸福:文章中提到的一个在线开发程序,叫做app invertor,于是在网上 ...

  6. 【AI2】更新app inventor离线开发环境百度网盘下载链接,安卓app图形化开发环境...

    只先存了百度网盘,知道大家有意见,目前还没找到更好的存储位置,找到后会立刻更新,没有百度会员的朋友可以加群,群里定期更新(你懂的)账号.着急用的朋友也可以QQ私聊我,在线发送. 软件使用: 解压之后运 ...

  7. 【AI2】喜讯!app inventor最近进展,实现流媒体视频播放

    运气不错,没费多少时间居然整出来了,虽然不难,但对我这个app inventor新手来说还是一件非常值得高兴的事,下边把几处容易出错的地方总结分享给大家,希望大家少走弯路. 如标题所示[AI2]作为新 ...

  8. 双击打开Inventor文件

    为什么80%的码农都做不了架构师?>>>    出现的问题: 正常启动电脑后,我双击桌面上的一个idw文件,默认使用 Inventor 2013 打开该格式的文件:但 Invento ...

  9. inventor如何钣金出弧面_Inventor教程之钣金多规则

    钣金多规则是继钣金多实体之后,Inventor 在钣金模块功能的又一重要增强. 钣金多规则基于钣金多实体的基础上,完善了用户需要在不同实体上赋予不同板厚.展开规则.折弯释压形状.拐角释压形状以及尺寸等 ...

  10. 简单计算机app inventor,app inventor计算器

    <app inventor计算器>由会员分享,可在线阅读,更多相关<app inventor计算器(10页珍藏版)>请在人人文库网上搜索. 1.App Inventor之 计算 ...

最新文章

  1. 论文简述 | CamVox: 一种低成本、高精度的激光雷达辅助视觉SLAM系统
  2. pandas使用pad函数向dataframe特定数据列的每个字符串添加后置(后缀)补齐字符或者字符串、向所有字符串的右侧填充、直到宽度达到指定要求(right padding)
  3. 我从GitHub上看到了编程语言八年变迁史 | Reddit 30.7k
  4. 在Ubuntu14.04上安装UberWriterMarkdown编辑器
  5. python奖励多少钱_关于python的问题,好的高奖励!
  6. oracle 依赖包自动安装包,ORACLE 安装提示缺少依赖包
  7. fillrect不填充被覆盖的区域 mfc_纹理和图案填充
  8. 怎么保存php格式,把php代码保存到php文件实现方法
  9. 移动磁盘提示使用驱动器中的光盘之前需要格式化文件怎么找回
  10. html引用ttf字体文件
  11. 【VUE】微商城(四)----封装轮播图组件,axios安装使用
  12. 全国最佳医院排名,为家人留一份
  13. 高等教育中的人工智能市场现状研究分析报告-
  14. 大学物理上册详细笔记_大学物理上册课堂笔记
  15. jQuery Pjax于ajax的区别
  16. web常见特效——floor电梯导航
  17. java和Android学习书籍
  18. cdma特有效应_CDMA技术基础知识
  19. watchfit鸿蒙,华为WATCH FIT运动手表评测:12门健身课程44项健身动作 陪你燃烧卡路里...
  20. 黄山迎今冬“首场雾凇”,奇松怪柏摇身一变,成了玉树琼枝

热门文章

  1. 通信原理 概念 笔记
  2. 原版windows下载地址
  3. Java常用集合框架源码解析合集
  4. java ee 酒店管理系统,基于jsp的小型酒店管理系统-JavaEE实现小型酒店管理系统 - java项目源码...
  5. mysql数据库安装教程(超级超级详细)
  6. windows server 2019添加开机启动项
  7. 十大算法(动图讲解)❤️超详细!
  8. jenkins集成sonar问题记录
  9. 良心推荐效率办公!清描:精准稳定的文字识别软件
  10. Gdiplus的使用