今天得到一个文件,格式如下:
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;
}