求助吧主 隐函数vtkCylinder能否旋转之后用于裁剪
vtk吧
全部回复
仅看楼主
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
level 6
小二哥1173 楼主
已解决 是自己想的太复杂了
//隐函数
vtkSmartPointer<vtkCylinder> m_cylinder = vtkSmartPointer<vtkCylinder>::New();
m_cylinder->SetCenter(tmp12->x,tmp12->y,tmp12->z);
m_cylinder->SetRadius(HoleRadius);
//旋转
vtkTransform*torusT = vtkTransform::New();
torusT->PostMultiply();
double angle = atan(CellNormal[0]/CellNormal[1]);
vtkTransform *trans = vtkTransform::New();
trans->PostMultiply();
trans->Translate(-tmp12->x,-tmp12->y,-tmp12->z);
trans->RotateZ(180-angle/PI*180);
trans->Translate(tmp12->x,tmp12->y,tmp12->z);
//加入旋转
m_cylinder->SetTransform(trans);
就好了
2017年08月18日 02点08分 2
感觉很多时候都是自问自答,做VTK的人太少了[乖]
2017年08月18日 03点08分
@云水劲松🐵 每次发完贴之后就感觉问题能解决了 然后就真的解决了 发帖似乎能增加信心???哈哈
2017年08月21日 02点08分
@小二哥1173 对,赞成你的说法。哈哈哈
2017年08月21日 03点08分
level 1
很有帮助啊 谢谢啊
2017年12月21日 06点12分 3
1