通过三维操作菜单进入数据采集的对话框部分
通过三维操作菜单进入点云显示(工程文件为SDIshow3D),读取Pts三维坐标点云文件
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
#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 运行结果(生成圆锥体)
启动VC6.0,创建新的工程,File | New | Projects | MFC AppWizard (exe)。假设工程名为"MFCViewer"。对向导使用默认配置,可以创建单文档或多文档程序。
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
#include
修改方法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
}
}
当用户创建新文档时(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 编译并运行项目。应用程序启动并打开一个窗口,显示出我们刚刚创建的场景图。