利用文件RGB值渲染点云

来源:互联网 发布:js调用点击事件 编辑:程序博客网 时间:2024/06/05 08:21

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


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 polydatavtkSmartPointer<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 <= 5glyph3D->SetInput(polydata);#elseglyph3D->SetInputData(polydata);#endifglyph3D->ScalingOff();glyph3D->Update();// Create a mapper and actorvtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(glyph3D->GetOutputPort());vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);//actor->GetProperty()->SetPointSize(10);// VisualizevtkSmartPointer<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 whiterenderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;}


0 0