第三节《vtkActor重新实现-FreeActor讲解》

本文介绍了为何以及如何重写vtkActor,目的是为了解决在进行模型标注时,使标记点(如小球)在相机缩放时保持在视口中的大小不变。通过在Render函数中计算相机缩放系数并调整actor,确保小球的视觉大小固定。然而,目前代码存在一个问题:当模型部分透明时,透明效果表现异常,作者计划在后续章节中解决此bug。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        这一节我们主要讲解vtkActor被继承后,如何重新实现,首先说一下为什么要重新实现vtkActor, 网上大多数文章重新实现vtkActor主要目的是将重新实现的actor变成具有一定功能的类,比如做一个测量控件,测量显示模型包含2个端点球模型、一条线段、一个刻度。将这些单一模型都放在了新的actor中进行创建与计算,最后当成一个整体使用。但是我个人感觉这样做不是很好,actor主要目的是处理各种显示问题,里面有很多显示处理相关函数,如果都放在一起写,里面还要有模型处理与计算相关函数,这样设计不是很合理。但是我重写vtkActor主要目的是想处理一些vtk没有提供的方法,都是一些显示相关的,比如我们在做模型标注功能时,往往采用绘制一个小球当做标记点,我们是希望小球大小与视口是固定不变的,相机是否无论怎么缩放小球显示大小不应该变化。起初我认为vtk应该有相关设置接口,但是我没找到,所以我就重写实现vtkActor将这个功能加进去。

                这个功能需要添加在Render函数中,这个函数当Renderer更新会调用这个虚函数,原理其实很简单,就是获取相机缩放系数,actor做相应的变化。

void FreeActor::Render(vtkRenderer *ren)
{
    this->Device->SetProperty(this->Property);
    th
在VTK中,对窗口内的 `vtkVolume` 和 `vtkActor` 重新排序可以使用 `SetVisibilitySortValue` 函数,以及 `SetPickFrontOrder` 函数来影响它们在渲染过程中的排列顺序。这里是一些关键点: - **Visibility Sort Value**:这个属性用于按照物体的“深度”来排序,值越小,物体越靠近观察者。对于 `vtkActor`,可以设置其 `GetProperty().SetVisibilitySortValue(value)`,将 `value` 设定为你希望的排序值。 - **Pick Front Order**:当你选择物体时,VTK会选择最前面的物体。对于 `vtkVolume`,设置 `volume.GetProperty().SetPickFrontOrder(order)`,`order` 可以是 `vtkVolumeProperty::FRONT_TO_BACK` 或 `vtkVolumeProperty::BACK_TO_FRONT`,分别对应前后顺序。 如果你想手动控制渲染顺序,还可以通过 `AddAndObserveRenderView` 方法添加视图的更改通知,然后在 `ModifiedEvent` 中改变对象的顺序。 示例代码(假设你已经有了actors和volumes列表): ```python for actor in actors: actor.GetProperty().SetVisibilitySortValue(actor_index) # actor_index是你想设置的排序位置 for volume in volumes: volume.GetProperty().SetPickFrontOrder(vtkVolumeProperty.BACK_TO_FRONT) # 添加事件监听并重新排序 render_view = render_window.GetActiveRenderView() render_view.AddAndObserveRenderTraversalEvent(lambda event: self.reorder_objects()) def reorder_objects(): # 在这里根据你的需求重新排列actors和volumes pass ``` 记得在每次添加、删除或移动 `vtkActor` 或 `vtkVolume` 后,都要调用相应的 `Modified` 方法,以便通知VTK视图需要更新渲染顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

《雨声》

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值