利用文件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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章