VTK以批量三维点坐标为中心(点云)绘制球体,可用于标识特征点或者是化学分子

22 篇文章 18 订阅

在原先的博客VTK读取一个TXT文档中的三维点坐标绘制三维点云基础上,有小伙伴询问是否可以以点云中每一个三维点的坐标为中心绘制一个小的球体,用于标识特征点,这种就让我想到了化学里面的分子结构,所以就在原有博客的基础上进行了改写,实现了点云不是以点的方式而是以小球体形式显示出来,实现了大量球体的同时绘制。

不多说直接贴代码:

 

#include <iostream>
#include <vector>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkInteractorStyleTrackball.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkCellArray.h>
#include <vtkPolyDataMapper.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
using namespace std;

void main(int argc, char* argv[])
{ 
	vtkSmartPointer<vtkRenderer> renderer=vtkSmartPointer< vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> istyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();     
	renderWindowInteractor->SetInteractorStyle( style );//设置交互器风格 

	//_读进点云数据信息
	FILE*fp = NULL; fp=fopen("E:\\斯坦福兔子3000点.txt","r");	//2DpointDatas.txt
	if(!fp)
	{
		printf("打开文件失败!!\n");
		int m;
		cin>>m;
		exit(0);
	}
	double x=0,y=0,z=0;
	int i = 0;
	
	while (!feof(fp))
	{
		
		fscanf(fp,"%lf %lf %lf",&x,&y,&z);
		//以每一个三维作为中心画球
		vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();//定义局部球对象
		sphereSource->SetCenter(x, y, z);//设置球的中心
		sphereSource->SetRadius(0.001);//设置球的半径
		sphereSource->SetThetaResolution(10);//设置球表面精度,值越大球的光滑程度越高
		vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();//定义局部PolydataMapper对象
		mapper->SetInputConnection(sphereSource->GetOutputPort());
		vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();//定义局部actor对象
		actor->SetMapper(mapper);
		actor->GetProperty()->SetColor(0,1,0);//设置球的颜色,这里可以为每个点赋不同的颜色或者是随机颜色
		actor->GetProperty()->SetRepresentationToWireframe();//以线框的方式显示
	//	actor->GetProperty()->SetRepresentationToSurface();//以表面的方式显示
		renderer->AddActor(actor);//将局部的actor加入到全局的绘制对象renderer中
		i ++;
	}	
	fclose(fp);

	renderer->SetBackground(1,1,1);//设置背景颜色
	renderWindow->Render();
	renderWindow->SetSize(800,800);//设置窗口大小
	renderWindowInteractor->Start();
} 


后面我以斯坦福兔子的点云(3000点)做了实验,效果如下

 

整体图:

 

局部的线框显示细节图:

 

局部表面显示细节图:

如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
.05, false, false, false, 40), new Card(9, 6, 14, 0, 0.15, false, false, false, 55), new Card(7, 7, 15, 0, 0要在vtk.js中绘制三维点,可以使用vtk.js中提供的vtkPoints和vtkGlyph3D类。以下.2, false, false, false, 50), new Card(11, 4, 16, 0, 0是一个简单的例子: ```javascript // 创建一个vtkPoints对象 const points = vtk.Common.Core.vtkPoints.newInstance(); .1, false, false, false, 45) ); $cards2 = array( new Card(8, 7, // 添加点 points.insertNextPoint(0, 0, 0); points.insertNextPoint(1, 0, 014, 0, 0.1, false, false, false, 55), new Card(9, 5, ); points.insertNextPoint(0, 1, 0); points.insertNextPoint(0, 0, 1); // 创建15, 0, 0.2, false, false, false, 50), new Card(7, 8, 15, 0, 0.15, false, false, false, 60), new Card(11, 3, vtkGlyph3D对象 const glyph = vtk.Filters.General.vtkGlyph3D.newInstance({ input: points, }); // 设置glyph的16, 0, 0.05, false, false, false, 40), new Card(10, 4, 属性 glyph.setInputArrayToProcess(0, 0, 0, vtk.Common.DataModel.vtkDataObject.FIELD_ASSOCIATION_POINTS16, 0, 0.1, false, false, false, 45), new Card(12, 2, , 'Scalars'); glyph.setSourceConnection(vtk.Filters.Sources.vtkArrowSource.newInstance().getOutputPort()); glyph.setVectorModeToUse17, 0, 0.1, false, false, false, 35) ); // 创建队伍 $team1 =Normal(); // 创建vtkActor对象 const actor = vtk.Rendering.Core.vtkActor.newInstance(); actor.getProperty().setPointSize(5); // 设置 new Team($cards1); $team2 = new Team($cards2); // 开始战斗 $battle = new Battle($team1, $team2); $battle->start(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HW140701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值