vtkActor 设置特定图层 显示及置顶显示

问题,有时我们需要显示某个 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) vtkSPtr<Type> Var = vtkSPtr<Type>::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 top
    const 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;

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设置点云的透明度,可以使用 `vtkProperty` 类的 `SetOpacity` 方法。以下是一个简单的 C++ 代码示例: ```c++ #include <vtkSmartPointer.h> #include <vtkPLYReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkProperty.h> int main() { // 读取点云数据 vtkSmartPointer<vtkPLYReader> reader = vtkSmartPointer<vtkPLYReader>::New(); reader->SetFileName("point_cloud.ply"); reader->Update(); // 映射器 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(reader->GetOutputPort()); // 演员 vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 设置透明度 actor->GetProperty()->SetOpacity(0.5); // 渲染器 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); // 渲染窗口 vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 交互器 vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); interactor->Initialize(); interactor->Start(); return 0; } ``` 在该示例中,我们创建了一个 `vtkActor` 对象来表示点云数据。然后,我们使用 `SetOpacity` 方法将透明度设置为 `0.5`。最后,我们将演员添加到渲染器中,创建一个渲染窗口并启动交互器。这将显示点云数据,并将其透明度设置为 `0.5`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值