当前位置: 首页 > news >正文

vtkDepthSortPolyData 根据相机视图方向对多边形数据进行排序

1. 作用

在 3D 渲染中,透明对象的渲染顺序非常重要。如果透明对象的渲染顺序不正确,可能会导致错误的视觉效果(例如,远处的透明对象遮挡了近处的透明对象)。vtkDepthSortPolyData 通过对多边形数据进行深度排序,确保透明对象按照正确的顺序渲染。

主要功能
  • vtkPolyData 中的多边形(cells)进行深度排序。

  • 支持按相机视角(camera view)或指定方向(direction)进行排序。

  • 适用于透明渲染(translucent rendering)的场景。


2. 使用场景

  • 透明渲染:当场景中有多个透明对象时,使用 vtkDepthSortPolyData 可以确保它们按照正确的顺序渲染。

  • 复杂几何体:对于复杂的几何体,手动调整渲染顺序可能非常困难,vtkDepthSortPolyData 可以自动完成排序。

  • 动态场景:在动态场景中,相机或物体的位置可能不断变化,vtkDepthSortPolyData 可以根据当前视角动态调整排序。


3. 使用方法

以下是 vtkDepthSortPolyData 的基本使用步骤:

步骤 1:创建输入数据

首先,需要一个 vtkPolyData 作为输入数据。例如,可以使用 vtkSphereSource 生成一个球体。

 

sphere = vtk.vtkSphereSource()
sphere.SetRadius(1.0)
sphere.SetThetaResolution(50)
sphere.SetPhiResolution(50)
sphere.Update()

步骤 2:创建 vtkDepthSortPolyData 过滤器

将输入数据连接到 vtkDepthSortPolyData

 

depthSort = vtk.vtkDepthSortPolyData()
depthSort.SetInputConnection(sphere.GetOutputPort())
步骤 3:设置排序方向

可以指定排序方向,或者使用相机视角进行排序。

  • 使用相机视角

    depthSort.SetDirectionToBackToFront()  # 从后到前排序
    depthSort.SetCamera(camera)  # 传入相机对象
  • 指定方向

    depthSort.SetVector(0, 0, 1)  # 沿 Z 轴方向排序
    depthSort.SetDirectionToSpecifiedVector()  # 使用指定方向
步骤 4:执行排序

调用 Update() 方法执行排序。

 

depthSort.Update()

步骤 5:使用排序后的数据

将排序后的数据传递给 vtkPolyDataMapper 进行渲染。

 

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(depthSort.GetOutputPort())

actor = vtk.vtkActor()
actor.SetMapper(mapper)


4. 完整代码示例

按 Z 值排序

大球在前;

以下是一个完整的示例,展示如何使用 vtkDepthSortPolyData 对球体进行深度排序并渲染:

 

import vtk
import sys

if len(sys.argv) != 5:
    print(f"Usage: {sys.argv[0]} DepthSortFlag ThetaResolution PhiResolution ScalarVisibilityFlag")
    print("Example: 1 100 100 0")
    #sys.exit(1)
    sys.argv = [1 ,100 ,50, 30,1]


do_depth_sort = 1###int(sys.argv[1]) == 1
theta = int(sys.argv[2])
phi = int(sys.argv[3])
scalar_visibility = int(sys.argv[4]) == 1

colors = vtk.vtkNamedColors()

append_data = vtk.vtkAppendPolyData()

for i in range(5):
    sphere_source = vtk.vtkSphereSource()
    sphere_source.SetThetaResolution(theta)
    sphere_source.SetPhiResolution(phi)
    sphere_source.SetRadius(0.5)

    if i == 0:
        #sphere_source.SetRadius(1)
        sphere_source.SetCenter(0, 0, 0)
    elif i == 1:
        sphere_source.SetCenter(1, 0, -1)
        sphere_source.SetRadius(0.5)
    elif i == 2:
        sphere_source.SetCenter(-1, 0, -2)
        sphere_source.SetRadius(0.6)
    elif i == 3:
        sphere_source.SetCenter(0, 1, -3)
        sphere_source.SetRadius(0.7)
    elif i == 4:
        sphere_source.SetCenter(0, -1, -4)
        sphere_source.SetRadius(0.8)

    sphere_source.Update()
    append_data.AddInputConnection(sphere_source.GetOutputPort())

camera = vtk.vtkCamera()
depth_sort = vtk.vtkDepthSortPolyData()

depth_sort.SetInputConnection(append_data.GetOutputPort())
#depth_sort.SetDirectionToBackToFront()
depth_sort.SetVector(0, 0, 1)   ########### set z value
depth_sort.SetDirectionToSpecifiedVector()
depth_sort.SetCamera(camera)
depth_sort.SortScalarsOn()
depth_sort.Update()

mapper = vtk.vtkPolyDataMapper()

if do_depth_sort:
    mapper.SetInputConnection(depth_sort.GetOutputPort())
else:
    mapper.SetInputConnection(append_data.GetOutputPort())

mapper.SetScalarVisibility(scalar_visibility)
if scalar_visibility:
    mapper.SetScalarRange(0, depth_sort.GetOutput().GetNumberOfCells())

actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetOpacity(0.5)
actor.GetProperty().SetColor(colors.GetColor3d("Crimson"))
actor.RotateX(-72)

depth_sort.SetProp3D(actor)

renderer = vtk.vtkRenderer()
renderer.SetActiveCamera(camera)
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window.SetWindowName("DepthSortPolyData")

render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetRenderWindow(render_window)

renderer.AddActor(actor)
renderer.SetBackground(colors.GetColor3d("SlateGray"))
render_window.SetSize(600, 400)

renderer.ResetCamera()
renderer.GetActiveCamera().Zoom(2.2)

render_window_interactor.Initialize()
render_window.Render()
render_window_interactor.Start()
 

5. 关键参数

  • SetDirectionToBackToFront():从后到前排序(基于相机视角)。

  • SetDirectionToFrontToBack():从前到后排序(基于相机视角)。

  • SetVector(x, y, z):指定排序方向向量。

  • SetCamera(camera):设置相机,用于基于视角的排序。

  • SetProp3D(prop):设置 3D 对象,用于基于对象的排序。


6. 注意事项

  • 性能:深度排序会增加额外的计算开销,尤其是在处理大规模数据时。

  • 动态场景:如果相机或物体的位置发生变化,需要重新调用 Update() 方法更新排序。

  • 透明度:只有在启用透明度(SetOpacity)时,深度排序才有意义。


7. 总结

vtkDepthSortPolyData 是一个非常有用的工具,用于解决透明渲染中的排序问题。通过深度排序,可以确保透明对象按照正确的顺序渲染,从而避免视觉错误。在实际使用中,可以根据场景需求选择基于相机视角或指定方向的排序方式。

http://www.dtcms.com/a/56034.html

相关文章:

  • 2025政府工作报告亮点:发展新质生产力,为现代化产业体系 “赋能提速”!
  • leetcode日记(84)交错字符串
  • 基于STM32的简易出租车计费设计(Proteus仿真+程序+设计报告+原理图PCB+讲解视频)
  • 计算机组成原理笔记(一)——1.1电子计算机与存储程序控制
  • flask-定时任务
  • AMBA 总线及AXI协议介绍
  • 【计网】运输层
  • 【PSIM】峰值电流如何用D类触发器
  • 浅说图论基础
  • 数据库【MySQL安装配置篇(保姆级教程)】
  • 【go】以Kubernetes中的 kubelet 为引思考go语言中共享状态的选择
  • LeetCode 解题思路 12(Hot 100)
  • 使用ffmpeg读取mp4文件解码失败
  • 如何记录日常笔记
  • Django 中的算法应用与实现
  • LeetCode - 神经网络的 反向传播(Sigmoid + MSE) 教程
  • 玩转python: 掌握Python数据结构之链表
  • 安当全栈式金仓数据库安全解决方案:透明加密、动态凭据与勒索防护一体化实践
  • 【免费】2000.1-2021.9上市公司仲裁数据
  • TypeError: Cannot set properties of undefined (setting ‘xxx‘)
  • c++快速入门-2
  • 计算机网络-服务器模型
  • labelimg标注的xml标签转换为yolo格式标签
  • TMS320F28P550SJ9学习笔记4:导入其余包文件
  • 若依ry-vue分离板(完整版)前后端部署
  • AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革
  • 元宇宙崛起:区块链与金融科技共绘数字新世界
  • RuleOS:DApp开发的“破局者”,区块链创新的“加速器
  • 从零开始的远程服务器跑深度学习(一)
  • 【基础1】冒泡排序