利用VTK库开发基于MFC的应用程序

利用VTK库开发基于MFC的应用程序
在用VTK库时,感觉很难开发出MFC的应用程序,VTK提供的vtkMFCWindow类封装的太死,在参考vtkMFCWindow类的实现方式后,通过改造单文档应用程序中的View类,直接在View类中就能响应MFC消息,同时又能利用VTK库本身的东西。在我的例子中,能打开VTK格式文件,同时能用鼠标进行移动旋转,缩放等操作,而且响应右键菜单,插入一个3ds文件。
主要修改地方:
在HBVRView.h中增加成员变量和函数:

public :
 vtkRenderer
*  GetRenderer()  { ASSERT(m_pRenderer); return m_pRenderer; }
 vtkWin32OpenGLRenderWindow
*  GetRenderWindow() { return m_pRenderWindow;}
 vtkRenderWindowInteractor
*  GetInteractor();

protected :
 vtkRe
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个基于VTK实现ICP的简单示例代码,假设已经有两个点云`sourceCloud.vtk`和`targetCloud.vtk`,需要将`sourceCloud`对齐到`targetCloud`: ```cpp #include <vtkSmartPointer.h> #include <vtkIterativeClosestPointTransform.h> #include <vtkLandmarkTransform.h> #include <vtkPolyData.h> #include <vtkPolyDataReader.h> #include <vtkPolyDataWriter.h> #include <vtkPointSource.h> int main(int argc, char* argv[]) { // 读取源点云和目标点云 vtkSmartPointer<vtkPolyDataReader> sourceReader = vtkSmartPointer<vtkPolyDataReader>::New(); sourceReader->SetFileName("sourceCloud.vtk"); sourceReader->Update(); vtkSmartPointer<vtkPolyDataReader> targetReader = vtkSmartPointer<vtkPolyDataReader>::New(); targetReader->SetFileName("targetCloud.vtk"); targetReader->Update(); // ICP变换 vtkSmartPointer<vtkIterativeClosestPointTransform> icp = vtkSmartPointer<vtkIterativeClosestPointTransform>::New(); icp->SetSource(sourceReader->GetOutput()); icp->SetTarget(targetReader->GetOutput()); icp->GetLandmarkTransform()->SetModeToRigidBody(); icp->SetMaximumNumberOfIterations(100); icp->StartByMatchingCentroidsOn(); icp->Update(); // 应用变换到源点云 vtkSmartPointer<vtkPolyData> transformed = vtkSmartPointer<vtkPolyData>::New(); transformed->ShallowCopy(sourceReader->GetOutput()); vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New(); transform->SetMatrix(icp->GetMatrix()); vtkSmartPointer<vtkTransformPolyDataFilter> transformFilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New(); transformFilter->SetTransform(transform); transformFilter->SetInputData(transformed); transformFilter->Update(); // 输出变换后的点云 vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New(); writer->SetFileName("transformedCloud.vtk"); writer->SetInputData(transformFilter->GetOutput()); writer->Write(); return 0; } ``` 该代码使用`vtkIterativeClosestPointTransform`实现ICP变换,并通过`vtkTransform`将变换应用到源点云上。最后将变换后的点云输出到文件中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值