Open Inventor Coin3D


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

Open Inventor Coin3D_第1张图片

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

Open Inventor Coin3D_第2张图片

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

二、Coin3D与 Visual Studio 2008 配置

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

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

Open Inventor Coin3D_第3张图片

需要注意的是,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)        设置环境变量,如下图所示:

Open Inventor Coin3D_第4张图片

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

#include

#include

#include

 

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  运行结果(生成圆锥体)

Open Inventor Coin3D_第5张图片 

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

1、创建工程

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

2、为SoWin和Coin添加代码

u  打开MFCViewer.cpp文件。

包含头文件:

#include

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

SoWin::init("");

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

u  打开MFCViewerView.h文件。

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

#include

#include

添加公共数据成员:

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 // remove me later

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

#include

#include

#include

#include

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

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_第6张图片

你可能感兴趣的:(Open Inventor Coin3D)