level 6
小二哥1173
楼主
圆柱隐函数默认的方向是竖直向下的,我想要将隐函数逆时针旋转60°后用于裁剪,但是失败了。想要求助各位,是否隐函数无法旋转之后用于裁剪,或者是我的方法不对呢。我的代码如下:
//隐函数
vtkSmartPointer<vtkCylinder> m_cylinder = vtkSmartPointer<vtkCylinder>::New();
m_cylinder->SetCenter(x,y,z);
m_cylinder->SetRadius(HoleRadius);
//对theCream隐函数进行采样
vtkSampleFunction *theCylinderSample = vtkSampleFunction::New();
theCylinderSample->SetImplicitFunction(m_cylinder);
//生成几何体
vtkContourFilter *theCylinderSurface = vtkContourFilter::New();
theCylinderSurface->SetInput((vtkDataSet *)theCylinderSample->GetOutput());
theCylinderSurface->SetValue(2,0);
//旋转
vtkTransform*torusT = vtkTransform::New();
torusT->PostMultiply();
vtkTransform *trans = vtkTransform::New();
trans->PostMultiply();
trans->Translate(-x,-y,-z);
trans->RotateZ(60);
trans->Translate(x,y,z);
vtkTransformPolyDataFilter *tf = vtkTransformPolyDataFilter::New();
tf->SetInputConnection(theCylinderSurface->GetOutputPort());
tf->SetTransform(trans);
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
cylinderMapper->SetInputConnection(tf->GetOutputPort());
cylinderMapper->ScalarVisibilityOff();
vtkAppendPolyData *append = vtkAppendPolyData::New();
append->AddInput(cylinderMapper->GetInput());
//转换为隐函数
vtkImplicitPolyData *polyToImplicitDataB = vtkImplicitPolyData::New();
polyToImplicitDataB->SetInput(append->GetOutput());
//裁剪
vtkSmartPointer<vtkClipPolyData> m_clipper = vtkSmartPointer<vtkClipPolyData>::New();
m_clipper->SetInputConnection(trissloop->GetOutputPort());
m_clipper->SetClipFunction(polyToImplicitDataB);
m_clipper->Update();
//显示
vtkSmartPointer<vtkPolyDataMapper> boundaryMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
boundaryMapper->SetInputConnection(m_clipper->GetOutputPort());
boundaryMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor>cylinderActor = vtkSmartPointer<vtkActor>::New();
boundaryActor->SetMapper(boundaryMapper);
boundaryActor->GetProperty()->SetColor(0,1,0);
ren->AddActor(boundaryActor);
renWin->Render();
主要的思路是借鉴了http://blog.csdn.net/zxgis/article/details/7733018的思路,vtkImplicitPolyData 这个类不是vtk自带的,是在CodeForge上面下载的。
如果有其他的方法能够实现旋转之后的裁剪,也希望大家能指导一下。
2017年08月17日 08点08分
1
//隐函数
vtkSmartPointer<vtkCylinder> m_cylinder = vtkSmartPointer<vtkCylinder>::New();
m_cylinder->SetCenter(x,y,z);
m_cylinder->SetRadius(HoleRadius);
//对theCream隐函数进行采样
vtkSampleFunction *theCylinderSample = vtkSampleFunction::New();
theCylinderSample->SetImplicitFunction(m_cylinder);
//生成几何体
vtkContourFilter *theCylinderSurface = vtkContourFilter::New();
theCylinderSurface->SetInput((vtkDataSet *)theCylinderSample->GetOutput());
theCylinderSurface->SetValue(2,0);
//旋转
vtkTransform*torusT = vtkTransform::New();
torusT->PostMultiply();
vtkTransform *trans = vtkTransform::New();
trans->PostMultiply();
trans->Translate(-x,-y,-z);
trans->RotateZ(60);
trans->Translate(x,y,z);
vtkTransformPolyDataFilter *tf = vtkTransformPolyDataFilter::New();
tf->SetInputConnection(theCylinderSurface->GetOutputPort());
tf->SetTransform(trans);
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
cylinderMapper->SetInputConnection(tf->GetOutputPort());
cylinderMapper->ScalarVisibilityOff();
vtkAppendPolyData *append = vtkAppendPolyData::New();
append->AddInput(cylinderMapper->GetInput());
//转换为隐函数
vtkImplicitPolyData *polyToImplicitDataB = vtkImplicitPolyData::New();
polyToImplicitDataB->SetInput(append->GetOutput());
//裁剪
vtkSmartPointer<vtkClipPolyData> m_clipper = vtkSmartPointer<vtkClipPolyData>::New();
m_clipper->SetInputConnection(trissloop->GetOutputPort());
m_clipper->SetClipFunction(polyToImplicitDataB);
m_clipper->Update();
//显示
vtkSmartPointer<vtkPolyDataMapper> boundaryMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
boundaryMapper->SetInputConnection(m_clipper->GetOutputPort());
boundaryMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor>cylinderActor = vtkSmartPointer<vtkActor>::New();
boundaryActor->SetMapper(boundaryMapper);
boundaryActor->GetProperty()->SetColor(0,1,0);
ren->AddActor(boundaryActor);
renWin->Render();
主要的思路是借鉴了http://blog.csdn.net/zxgis/article/details/7733018的思路,vtkImplicitPolyData 这个类不是vtk自带的,是在CodeForge上面下载的。
如果有其他的方法能够实现旋转之后的裁剪,也希望大家能指导一下。