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