1,vtkCylinderSource创建圆柱体默认会沿y轴方向,不能直接改变朝向,但是可以改actor的朝向
2,合并polydata没什么,可以直接合,也可以合完用vtkCleanPolyData清除掉重复的点,清楚前后效果如下
代码有点乱
int main(int, char* [])
{
vtkNew<vtkNamedColors> colors;
// Create a sphere
vtkNew<vtkCylinderSource> cylinderSource;
cylinderSource->SetCenter(0.0, 0.0, 0.0);
cylinderSource->SetRadius(5.0);
cylinderSource->SetHeight(6.0);
cylinderSource->SetResolution(100);
cylinderSource->Update();
vtkSmartPointer<vtkPolyData> poly = cylinderSource->GetOutput();
vtkIdType tuples = poly->GetPointData()->GetNumberOfTuples();
vtkFloatArray* ColorField = vtkFloatArray::New();
ColorField->SetName("ColorField");
ColorField->SetNumberOfComponents(1);
ColorField->SetNumberOfTuples(tuples);
for (vtkIdType i = 0; i < tuples; i++)
{
ColorField->SetTuple1(i, 1);
}
poly->GetPointData()->AddArray(ColorField);
//vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
//writer->SetInputDataObject(poly);
//writer->SetFileName("G:/cylinder.vtk");
//writer->Update();
//create next sphere
vtkNew<vtkCylinderSource> cylinderSource2;
cylinderSource2->SetCenter(0.0, 6.0, 0.0);
cylinderSource2->SetRadius(5.0);
cylinderSource2->SetHeight(6.0);
cylinderSource2->SetResolution(100);
cylinderSource2->Update();
vtkSmartPointer<vtkPolyData> poly2 = cylinderSource2->GetOutput();
vtkIdType tuples2 = poly2->GetPointData()->GetNumberOfTuples();
vtkFloatArray* ColorField2 = vtkFloatArray::New();
ColorField2->SetName("ColorField");
ColorField2->SetNumberOfComponents(1);
ColorField2->SetNumberOfTuples(tuples2);
for (vtkIdType i = 0; i < tuples2; i++)
{
ColorField2->SetTuple1(i, 2);
}
poly2->GetPointData()->AddArray(ColorField2);
//合并两个poly
vtkSmartPointer<vtkAppendPolyData> appendFilter =
vtkSmartPointer<vtkAppendPolyData>::New();
appendFilter->AddInputData(poly);
appendFilter->AddInputData(poly2);
appendFilter->Update();
// 清除掉重合的点
vtkSmartPointer<vtkCleanPolyData> cleanFilter =
vtkSmartPointer<vtkCleanPolyData>::New();
cleanFilter->SetInputConnection(appendFilter->GetOutputPort());
cleanFilter->Update();
//vtkSmartPointer<vtkPolyData> lastOnePoly = appendFilter->GetOutput();
vtkSmartPointer<vtkPolyData> lastOnePoly = cleanFilter->GetOutput();
vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
writer->SetInputDataObject(lastOnePoly);
writer->SetFileName("G:/AppendCylinder.vtk");
writer->Update();
// Create a mapper and actor
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(cylinderSource->GetOutputPort());
vtkNew<vtkActor> actor;
actor->GetProperty()->SetColor(colors->GetColor3d("Cornsilk").GetData());
actor->SetMapper(mapper);
//改变方向
actor->RotateX(90);
// Create a renderer, render window, and interactor
vtkNew<vtkRenderer> renderer;
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->SetWindowName("Cylinder");
renderWindow->AddRenderer(renderer);
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the actor to the scene
renderer->AddActor(actor);
renderer->SetBackground(colors->GetColor3d("DarkGreen").GetData());
// Render and interact
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}