news 2026/4/18 1:59:23

LayeredActors 多层渲染,分别控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LayeredActors 多层渲染,分别控制

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①actor的位置、方向和尺寸的控制方式,②window包含多个render,③多层render的选择交互


二:代码及注释

import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkFiltersSources import vtkCubeSource from vtkmodules.vtkRenderingCore import vtkActor, vtkRenderer, vtkRenderWindow, vtkPolyDataMapper, vtkProperty, \ vtkRenderWindowInteractor from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackballCamera from vtkmodules.vtkCommonTransforms import vtkTransform from vtkmodules.vtkRenderingAnnotation import vtkAxesActor def select_layer(caller, ev): iren = caller renderers = iren.GetRenderWindow().GetRenderers() if renderers.GetNumberOfItems() < 2: print('We need at least two renderers, we have only', renderers.GetNumberOfItems()) return # 初始化集合遍历 renderers.InitTraversal() ren0 = renderers.GetNextItem() ren1 = renderers.GetNextItem() """ 用于获取用户按下的键盘按键的符号名称 """ key = iren.GetKeySym() if key in ['0', 'KP_0']: # 如果是主键盘的0或者小键盘的KP_0 print('Selected layer:', key) """ 获取当前的鼠标交互样式对象 (vtkInteractorStyleTrackballCamera),并将其默认操作的渲染器设置为 ren0 意味着,从调用这行代码开始,用户通过鼠标和键盘进行的所有相机操作(旋转、平移、缩放)都将只作用于 ren0 这个渲染器的相机 """ iren.GetRenderWindow().GetInteractor().GetInteractorStyle().SetDefaultRenderer(ren0) # iren.GetInteractorStyle().SetDefaultRenderer(ren0) # 简便写法 ren0.InteractiveOn() ren1.InteractiveOff() if key in ['1', 'KP_1']: print('Selected layer:', key) iren.GetRenderWindow().GetInteractor().GetInteractorStyle().SetDefaultRenderer(ren1) # iren.GetInteractorStyle().SetDefaultRenderer(ren1) # 简便写法 ren0.InteractiveOff() ren1.InteractiveOn() def orient_layer(caller, ev): """ 在用户完成对某一层的操作后,立即将该层相机的新视角(即方向和位置)复制给另一层, 从而保证两个层中的对象始终保持完全相同的朝向 """ iren = caller renderers = iren.GetRenderWindow().GetRenderers() if renderers.GetNumberOfItems() < 2: print('We need at least two renderers, we have only', renderers.GetNumberOfItems()) return renderers.InitTraversal() ren0 = renderers.GetNextItem() ren1 = renderers.GetNextItem() if ren1.GetInteractive(): orient1 = get_orientation(ren1) set_orientation(ren0, orient1) ren0.ResetCamera() else: orient0 = get_orientation(ren0) set_orientation(ren1, orient0) ren1.ResetCamera() def get_orientation(ren): p = dict() camera = ren.GetActiveCamera() p['position'] = camera.GetPosition() p['focal point'] = camera.GetFocalPoint() p['view up'] = camera.GetViewUp() p['distance'] = camera.GetDistance() p['clipping range'] = camera.GetClippingRange() p['orientation'] = camera.GetOrientation() return p def set_orientation(ren, p): camera = ren.GetActiveCamera() camera.SetPosition(p['position']) camera.SetFocalPoint(p['focal point']) camera.SetViewUp(p['view up']) camera.SetDistance(p['distance']) camera.SetClippingRange(p['clipping range']) def main(): colors = vtkNamedColors() cube_source = vtkCubeSource() cube_source.SetCenter(0, 0, 0, ) cube_source.SetXLength(4) cube_source.SetYLength(9) cube_source.SetZLength(1) cube_mapper = vtkPolyDataMapper() cube_mapper.SetInputConnection(cube_source.GetOutputPort()) back = vtkProperty() back.SetColor(colors.GetColor3d("Sienna")) cube_actor = vtkActor() cube_actor.SetMapper(cube_mapper) cube_actor.GetProperty().SetDiffuseColor(colors.GetColor3d("BurlyWood")) cube_actor.GetProperty().EdgeVisibilityOn() cube_actor.GetProperty().SetLineWidth(2) cube_actor.GetProperty().SetEdgeColor(colors.GetColor3d('PapayaWhip')) cube_actor.SetBackfaceProperty(back) """ vtk中,actor的位置、方向和尺寸可以通过两种方式控制 1、内部变换 actor自身提供的方法,如SetPosition, RotateX/Y/Z,SetScale等 2、外部变换 使用SetUserTransform(vtkTransform) """ transform = vtkTransform() transform.Translate(0, 0, 0) axes = vtkAxesActor() axes.SetUserTransform(transform) renderers = list() ren_win = vtkRenderWindow() ren_win.SetSize(800, 800) ren_win.SetWindowName('LayeredActors') iren = vtkRenderWindowInteractor() iren.SetRenderWindow(ren_win) style = vtkInteractorStyleTrackballCamera() iren.SetInteractorStyle(style) for i in range(0, 2): renderers.append(vtkRenderer()) ren_win.AddRenderer(renderers[i]) """ SetLayer 一个 vtkRenderWindow 可以包含多个 vtkRenderer, 每个 Renderer 都可以在不同的层(layer)上绘制。层的顺序决定谁在上面、谁在下面 层号从0开始,层号越大,越靠上。 通常,只有底层(Layer 0)的背景是可见的,对于i>0的层,如果它们没有显示地设置背景颜色,又或者 它们的演员没有完全覆盖其视口区域,那么它们将是透明的 """ renderers[i].SetLayer(i) renderers[0].SetBackground(colors.GetColor3d('DarkSlateGray')) renderers[0].AddActor(cube_actor) # renderers[0].SetLayer(0) # 重复代码 renderers[1].AddActor(axes) renderers[1].SetBackground(colors.GetColor3d('MidnightBlue')) # renderers[1].SetLayer(1) # 重复代码 for renderer in renderers: camera = renderer.GetActiveCamera() camera.Elevation(-30) camera.Azimuth(-30) renderer.ResetCamera() """ renderWindow也要设置层级数目,与render对应 """ ren_win.SetNumberOfLayers(len(renderers)) ren_win.Render() iren.AddObserver('KeyPressEvent', select_layer) iren.AddObserver('EndInteractionEvent', orient_layer) iren.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 19:27:52

Firebase Admin PHP SDK:企业级后端开发的终极解决方案

Firebase Admin PHP SDK&#xff1a;企业级后端开发的终极解决方案 【免费下载链接】firebase-php Unofficial Firebase Admin SDK for PHP 项目地址: https://gitcode.com/gh_mirrors/fi/firebase-php Firebase Admin PHP SDK 是一个专为 PHP 开发者设计的非官方 Fireb…

作者头像 李华
网站建设 2026/4/15 20:08:16

Proteus 8 Professional中Keil调试信息输出的配置方法

在 Proteus 中“看见”程序运行&#xff1a;手把手教你配置 Keil 调试信息输出你有没有过这样的经历&#xff1f;写完一段单片机代码&#xff0c;烧进开发板后却不知道它到底干了什么。LED 不亮、串口没输出、变量值对不上……调试像在黑箱里摸索&#xff0c;全靠猜。如果能在电…

作者头像 李华
网站建设 2026/4/13 20:24:15

操作指南:Proteus下载安装后元件库缺失解决方法

解决Proteus安装后元件库找不到的完整实战指南你是不是也遇到过这种情况&#xff1a;好不容易搜到一个“Proteus下载安装”教程&#xff0c;兴冲冲地装完打开软件&#xff0c;结果一搜索“电阻”、“电容”、“AT89C51”&#xff0c;却发现什么都没有&#xff1f;“Pick Device…

作者头像 李华
网站建设 2026/4/16 13:57:10

Lottie-web终极评测:从设计到开发的无缝动画协作方案

Lottie-web终极评测&#xff1a;从设计到开发的无缝动画协作方案 【免费下载链接】lottie-web 项目地址: https://gitcode.com/gh_mirrors/lot/lottie-web 在当今追求极致用户体验的时代&#xff0c;网页动画已成为提升用户参与度和品牌形象的关键要素。传统动画开发方…

作者头像 李华
网站建设 2026/4/3 6:58:30

Zynq平台下XADC采集模拟信号项目应用

基于Zynq平台的XADC高精度模拟信号采集实战指南你有没有遇到过这样的场景&#xff1a;系统里接了几个温度、电压传感器&#xff0c;原本以为很简单&#xff0c;结果发现外部ADC芯片占PCB空间不说&#xff0c;SPI通信还卡顿&#xff0c;采样频率上不去&#xff0c;CPU整天忙着轮…

作者头像 李华
网站建设 2026/4/13 21:01:04

python微信小程序积分商城购物系跑腿配送系统_09ok4

目录具体实现截图项目介绍论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持Python(flask,django)、…

作者头像 李华