利用文件RGB值渲染点云

今天得到一个文件,格式如下:


1.74 5.50 -130.57 75 74 72
1.45 6.98 -130.55 101 97 85
2.11 4.89 -130.55 142 140 127
10.74 1.94 -133.11 138 138 130
10.76 2.05 -133.06 103 104 99

表示X-Y-Z-R-G-B,需要用RGB来指定每个点的颜色。后来在vtk的示例里面找到了一个类:vtkGlyph3D它的作用是用指定的几何体来代替每一个点,可以利用vtkGlyph3D::SetColorModeToColorByScalar()来设定颜色赋值的模式,即通过scale, scalar or by vector/normal值的大小来指定颜色。至于这里的几何体,我仍然选择的点。既然找到了就先用着吧,我估摸着自己走了弯路,应该还有更简单的方法。还是贴上代码做个笔记吧!

#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkPointData.h>
#include <vtkCubeSource.h>
#include <vtkPolyData.h>
#include <vtkPoints.h>
#include <vtkGlyph3D.h>
#include <vtkCellArray.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkUnsignedCharArray.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPointSource.h>
#include <vtkIntArray.h>
#include <vtkProperty.h>
#include <sstream>
#include <string>

using namespace std;

int main(int, char *[])
{
	vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
	vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
	colors->SetName("colors");
	colors->SetNumberOfComponents(3);

	FILE * fRead;
	fRead = fopen("C:\\Users\\Administrator\\Desktop\\Output1.txt","r");
	
	while(!feof(fRead))
	{
		double pt[3];
		int colr[3];
		unsigned char te[3];

		fscanf(fRead,"%lf %lf %lf %d %d %d",pt,pt+1,pt+2,colr,colr+1,colr+2);
		te[0] = (unsigned char)colr[0];
		te[1] = (unsigned char)colr[1];
		te[2] = (unsigned char)colr[2];
		points->InsertNextPoint(pt);
		colors->InsertNextTupleValue(te);
	}

	// Combine into a polydata
	vtkSmartPointer<vtkPolyData> polydata = 
		vtkSmartPointer<vtkPolyData>::New();
	polydata->SetPoints(points);
	polydata->GetPointData()->SetScalars(colors);

	// Create anything you want here, we will use a cube for the demo.
	vtkSmartPointer<vtkPointSource> pointsSource = 
		vtkSmartPointer<vtkPointSource>::New();
	pointsSource->SetNumberOfPoints(1);
	

	vtkSmartPointer<vtkGlyph3D> glyph3D = 
		vtkSmartPointer<vtkGlyph3D>::New();
	glyph3D->SetColorModeToColorByScalar();//通过scale, scalar or by vector/normal值的大小来指定颜色
	glyph3D->SetSourceConnection(pointsSource->GetOutputPort());
#if VTK_MAJOR_VERSION <= 5
	glyph3D->SetInput(polydata);
#else
	glyph3D->SetInputData(polydata);
#endif
	glyph3D->ScalingOff();
	glyph3D->Update();

	// Create a mapper and actor
	vtkSmartPointer<vtkPolyDataMapper> mapper = 
		vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(glyph3D->GetOutputPort());
	vtkSmartPointer<vtkActor> actor = 
		vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	//actor->GetProperty()->SetPointSize(10);

	// Visualize
	vtkSmartPointer<vtkRenderer> renderer = 
		vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow = 
		vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	renderWindowInteractor->SetInteractorStyle(style);

	renderer->AddActor(actor);
	renderer->SetBackground(0,0,0); // Background color white

	renderWindow->Render();
	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值