请教一个STL显示问题
vtk吧
全部回复
仅看楼主
level 1
cocaccX 楼主
我把STL文件进行显示,为什么中间的空洞显示出来有三角片的,不知道怎么去掉。
2017年08月01日 09点08分 1
level 1
cocaccX 楼主
vtkSmartPointer<vtkSTLReader> reader_l = vtkSmartPointer<vtkSTLReader>::New();
reader_l->SetFileName("D:\\TEST\\feiai\\xinzang.stl");
reader_l->Update();
smooth_l=vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
smooth_l->SetInputConnection(reader_l->GetOutputPort());
smooth_l->SetNumberOfIterations(5);
smooth_l->SetRelaxationFactor(0.1);
smooth_l->FeatureEdgeSmoothingOn();
smooth_l->BoundarySmoothingOn();
smooth_l->Update();
normals = vtkSmartPointer<vtkPolyDataNormals>::New();
normals->SetInputConnection( smooth_l -> GetOutputPort());
normals->FlipNormalsOn();
normals->ComputeCellNormalsOn();
normals->ComputePointNormalsOn();
normals->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper_l = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper_l->SetInputConnection(normals->GetOutputPort());
mapper_l->SetNumberOfPieces(1);
mapper_l->SetScalarRange(0 , 1);
mapper_l->SetColorMode(1);
mapper_l->SetResolveCoincidentTopology(0);
mapper_l->SetScalarMode(1);
mapper_l->SetImmediateModeRendering(0);
mapper_l->SetScalarVisibility(1);
mapper_l->SetUseLookupTableScalarRange(0);
mapper_l->Update();
actor_l =vtkSmartPointer<vtkActor>::New();
actor_l->SetMapper(mapper_l);
actor_l->GetProperty()->SetAmbientColor(0 , 0 , 0);
actor_l->GetProperty()->SetColor(0 , 0 , 0);
actor_l->GetProperty()->SetDiffuseColor(0 , 1 , 1);
actor_l->GetProperty()->SetOpacity(0.8);
actor_l->GetProperty()->SetInterpolation(1);
actor_l->GetProperty()->SetRepresentation(2);
actor_l->GetProperty()->SetBackfaceCulling(0);
actor_l->GetProperty()->SetFrontfaceCulling(1);
actor_l->GetProperty()->SetEdgeVisibility(0);
actor_l->GetProperty()->SetDiffuse(1);
actor_l->SetScale(1 , 1 , 1);
actor_l->SetVisibility(1);
2017年08月01日 09点08分 2
level 7
我觉可能是stl本身的模型在空洞处就有一些“细微的点” ,你可以先看看不做平滑的时候的效果。
2017年08月01日 12点08分 3
level 1
cocaccX 楼主
感谢帮我解决问题,我现在发现这个现象是这样的,我数据读出后直接给vtkPolyDataMapper,然后直接显示,在不透明的情况下看上去是正常的,只要设置了透明属性,超过两个平面叠加面,就出现这个现象。
2017年08月02日 00点08分 4
level 1
cocaccX 楼主
vtkSmartPointer<vtkSTLReader> reader_l = vtkSmartPointer<vtkSTLReader>::New();
reader_l->SetFileName("D:\\TEST\\feiai\\xinzang.stl");
reader_l->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper_l = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper_l->SetInputConnection(reader_l->GetOutputPort());
mapper_l->Update();
vtkSmartPointer<vtkActor> actor_l =vtkSmartPointer<vtkActor>::New();
actor_l->SetMapper(mapper_l);
actor_l->GetProperty()->SetSpecular(.4); //设置反射率
actor_l->GetProperty()->SetSpecularPower(200); //设置反射光强度*/
actor_l->GetProperty()->SetAmbientColor(0 , 1 , 1);
actor_l->GetProperty()->SetColor(0 , 1 , 1);
actor_l->GetProperty()->SetDiffuseColor(0 , 1 , 1);
actor_l->GetProperty()->SetOpacity(0.4);
actor_l->GetProperty()->SetBackfaceCulling(1);
actor_l->GetProperty()->SetFrontfaceCulling(1);
actor_l->GetProperty()->SetEdgeVisibility(0);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor_l);
renderer->SetBackground(0, 0, 0);
renderWindow->Render();
renderWindowInteractor->Start();
2017年08月02日 00点08分 5
level 7
我觉得这是正常的情况,你设置了透明度后stl模型平面叠加显示就是这样的。这是一个我的模型。如果你觉得显示效果不满意的话,可以试着调试一下光线,我觉得环境光可能会影响比较大,但我没有试过。
2017年08月02日 05点08分 6
level 1
cocaccX 楼主
非常感谢!
我测试了一下把light如果关闭的情况下,然后调整透明度,不会出现大量的三角面片,只是效果不太好。
2017年08月02日 05点08分 7
1