西安商城网站开发,营业执照怎么注销,最新室内装修风格图片,常德做网站专业公司哪家好问题#xff0c;有时我们需要显示某个 Actor 在相机最前面#xff0c;可以遮盖后面的物体;显示在顶层有点不准确#xff1b;因为这个还相机位置也有关系#xff1b;
这里讲三种情况#xff1a;
1. 设置 Mapper 顶层#xff0c;尝试了一下#xff0c;可以用于某些场景有时我们需要显示某个 Actor 在相机最前面可以遮盖后面的物体;显示在顶层有点不准确因为这个还相机位置也有关系
这里讲三种情况
1. 设置 Mapper 顶层尝试了一下可以用于某些场景具体原理未看源码
原理 设置 vtkPolyData的 point line polygon 值 //负值会靠近相机正值会远离相机 初始值就是0.0
显然他只能用于 vtkPolyData 数据 const double units0 -66000;sphereMapper-SetInputData(sphere-GetOutput());sphereMapper-SetResolveCoincidentTopologyToPolygonOffset();sphereMapper-SetRelativeCoincidentTopologyLineOffsetParameters(0, units0);sphereMapper-SetRelativeCoincidentTopologyPolygonOffsetParameters(0, units0);sphereMapper-SetRelativeCoincidentTopologyPointOffsetParameter(units0);样例 #include iostream
#include vtkSmartPointer.h
#include vtkSphereSource.h
#include vtkActor.h
#include vtkConeSource.h
#include vtkRenderer.h
#include vtkRenderWindow.h
#include vtkPolyDataMapper.h
#include vtkSphereSource.h
#include vtkRenderWindowInteractor.h
#include vtkProperty.h
#include vtkLineSource.h#define vtkSPtr vtkSmartPointer
#define vtkSPtrNew(Var, Type) vtkSPtrType Var vtkSPtrType::New();using namespace std;int main()
{vtkSPtrNew( sphere, vtkSphereSource );sphere-SetCenter( 0, 0, 0 );sphere-SetRadius( 1 );sphere-Update();vtkSPtrNew( sphereMapper, vtkPolyDataMapper );// set mapper to make sphere always on topconst double units0 -66000;sphereMapper-SetInputData( sphere-GetOutput() );sphereMapper-SetResolveCoincidentTopologyToPolygonOffset();sphereMapper-SetRelativeCoincidentTopologyLineOffsetParameters(0, units0);sphereMapper-SetRelativeCoincidentTopologyPolygonOffsetParameters(0, units0);sphereMapper-SetRelativeCoincidentTopologyPointOffsetParameter(units0);vtkSPtrNew( sphereActor, vtkActor );sphereActor-SetMapper( sphereMapper );sphereActor-GetProperty()-SetColor( 1, 0, 0 );vtkSPtrNew( cone, vtkConeSource );cone-SetRadius( 2 );cone-SetHeight( 4 );cone-Update();vtkSPtrNew( coneMapper, vtkPolyDataMapper );coneMapper-SetInputData( cone-GetOutput() );vtkSPtrNew( coneActor, vtkActor );coneActor-SetMapper( coneMapper );vtkSPtrNew( renderer, vtkRenderer );renderer-AddActor( coneActor );renderer-AddActor( sphereActor );renderer-SetBackground( 0, 0, 0 );vtkSPtrNew( renderWindow, vtkRenderWindow );renderWindow-AddRenderer( renderer );vtkSPtrNew( renderWindowInteractor, vtkRenderWindowInteractor );renderWindowInteractor-SetRenderWindow( renderWindow );renderer-ResetCamera();renderWindow-Render();renderWindowInteractor-Start();return 0;
}
2.设置 VTK的图层 0层最低在后面
RenderWindow 可以设置多个图层最前面的显示在上面
volumeRenderer_-SetLayer(0);
tagRenderer_-SetLayer(1);
GetRenderWindow()-SetNumberOfLayers(2);
GetRenderWindow()-AddRenderer(tagRenderer_);
GetRenderWindow()-AddRenderer(volumeRenderer_); 参考资料
https://blog.csdn.net/lpsl1882/article/details/52107117
尝试后发现并不能实现这的场景应该可以适应某些场景
3.设置相机 前后裁剪平面只有 前后裁剪平面内可见可见相机的作用
前后裁剪平面。裁剪平面与投影方向相交一般与投影方向也是垂直的。裁剪平面主要用于评估Actor与相机距离的远近只有在前后裁剪平面之间的Actor才是可见的。裁剪平面的位置可以用vtkCamera::SetClippingRange()方法设置。 这里可以看一下 vtkImageView2 源码 UpdateDisplayExtent怎么设置 某个图层可见
个面这个我修改了部分代码 vtkCamera *cam imageViewer-GetRenderer()-GetActiveCamera();if (cam){double bounds[6];actor-GetBounds(bounds);double spos bounds[2 * 2];double cpos cam-GetPosition()[2];double range fabs(spos - cpos);double *spacing mImageData-GetSpacing();double avg_spacing (spacing[0] spacing[1] spacing[2]) / 3.0;cam-SetClippingRange(range - avg_spacing * 3.0, range avg_spacing * 3.0);} 我最终要实现的是特定 Actor 显示在某个图层的上面可以需要调整 相机的 SetClippingRange;