news 2026/3/8 7:26:32

GradientBackground 比较不同类型的背景渐变着色模式与坐标转换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GradientBackground 比较不同类型的背景渐变着色模式与坐标转换

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①背景渐变着色的区分,②vtkCoordinate坐标系统的转化


二:代码及注释

from vtkmodules.vtkFiltersSources import vtkConeSource, vtkSphereSource from vtkmodules.vtkIOLegacy import vtkPolyDataReader from vtkmodules.vtkIOXML import vtkXMLPolyDataReader from vtkmodules.vtkIOGeometry import vtkOBJReader, vtkBYUReader, vtkSTLReader from vtkmodules.vtkIOPLY import vtkPLYReader from vtkmodules.vtkRenderingCore import vtkActor, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, \ vtkPolyDataMapper, vtkTextMapper, vtkTextProperty, vtkViewport, vtkCoordinate, vtkActor2D, vtkPolyDataMapper2D from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonCore import vtkPoints from vtkmodules.vtkCommonDataModel import ( vtkCellArray, vtkPolyData, vtkPolyLine ) def read_polydata_(path): poly_data = vtkPolyData() if path is None: # Default to a cone if the path is empty. source = vtkConeSource() source.SetResolution(25) source.SetDirection(0, 1, 0) source.SetHeight(1) source.Update() poly_data.DeepCopy(source.GetOutput()) return poly_data valid_suffixes = ['.g', '.obj', '.stl', '.ply', '.vtk', '.vtp'] ext = path.suffix.lower() if path.suffix not in valid_suffixes: print('Warning:', path, 'unknown extension, using a sphere instead.') source = vtkSphereSource() source.SetPhiResolution(50) source.SetThetaResolution(50) source.Update() poly_data.DeepCopy(source.GetOutput()) else: if ext == '.ply': reader = vtkPLYReader() reader.SetFileName(file_name) reader.Update() poly_data.DeepCopy(reader.GetOutput()) elif ext == '.vtp': reader = vtkXMLPolyDataReader() reader.SetFileName(file_name) reader.Update() poly_data.DeepCopy(reader.GetOutput()) elif ext == '.obj': reader = vtkOBJReader() reader.SetFileName(file_name) reader.Update() poly_data.DeepCopy(reader.GetOutput()) elif ext == '.stl': reader = vtkSTLReader() reader.SetFileName(file_name) reader.Update() poly_data.DeepCopy(reader.GetOutput()) elif ext == '.vtk': reader = vtkPolyDataReader() reader.SetFileName(file_name) reader.Update() poly_data.DeepCopy(reader.GetOutput()) elif ext == '.g': reader = vtkBYUReader() reader.SetGeometryFileName(file_name) reader.Update() poly_data.DeepCopy(reader.GetOutput()) return poly_data def viewport_border(renderer, sides, border_color, border_width): """ 在给定的 3D渲染器(vtkRenderer)对应的 2D视口(Viewport)周围绘制一个用户自定义颜色和宽度的边框 """ colors = vtkNamedColors() """ 先定义点的坐标 这里的坐标(x, y)是在标准化视口坐标系中定义的,范围从0到1 (0, 0)代表视口的左下角,(1, 1)代表视口的右上角。这四个点定义了视口区域的四个角 """ points = vtkPoints() points.SetNumberOfPoints(4) points.InsertPoint(0, 1, 1, 0) points.InsertPoint(1, 0, 1, 0) points.InsertPoint(2, 0, 0, 0) points.InsertPoint(3, 1, 0, 0) cells = vtkCellArray() cells.Initialize() if sides[0]: # Top top = vtkPolyLine() top.GetPointIds().SetNumberOfIds(2) top.GetPointIds().SetId(0, 0) top.GetPointIds().SetId(1, 1) cells.InsertNextCell(top) if sides[1]: # Left left = vtkPolyLine() left.GetPointIds().SetNumberOfIds(2) left.GetPointIds().SetId(0, 1) left.GetPointIds().SetId(1, 2) cells.InsertNextCell(left) if sides[2]: # Bottom bottom = vtkPolyLine() bottom.GetPointIds().SetNumberOfIds(2) bottom.GetPointIds().SetId(0, 2) bottom.GetPointIds().SetId(1, 3) cells.InsertNextCell(bottom) if sides[3]: # Right right = vtkPolyLine() right.GetPointIds().SetNumberOfIds(2) right.GetPointIds().SetId(0, 3) right.GetPointIds().SetId(1, 0) cells.InsertNextCell(right) poly = vtkPolyData() poly.Initialize() poly.SetPoints(points) poly.SetLines(cells) """ vtkCoordinate 负责处理 不同坐标系统之间的坐标转换,特别是在渲染(Renderer)和显示(Display)过程中 简单来说 vtkCoordinate就是用来表示并转换一个点在不同坐标系统中的位置 vtk中常见的坐标系统 名称 英文标识 描述 世界坐标 **World** 三维空间中物体的真实坐标(例如几何模型的点位置) 视图坐标 **View** 相机变换后的坐标(相机坐标系) 规范化视口坐标 **Normalized Viewport** 渲染窗口中的归一化坐标,范围 [0,1] 视口坐标 **Viewport** 渲染窗口内的像素坐标(受相机投影影响) 显示坐标 **Display** 屏幕上的实际像素坐标(例如鼠标点击位置) 规范化显示坐标 **Normalized Display** 屏幕归一化坐标,范围 [0,1] """ coordinate = vtkCoordinate() coordinate.SetCoordinateSystemToNormalizedViewport() # 设置 coordinate 的坐标系统为 Normalized Viewport(规范化视口坐标系) mapper = vtkPolyDataMapper2D() mapper.SetInputData(poly) mapper.SetTransformCoordinate(coordinate) actor = vtkActor2D() actor.SetMapper(mapper) actor.GetProperty().SetColor(colors.GetColor3d(border_color)) actor.GetProperty().SetLineWidth(border_width) renderer.AddViewProp(actor) def main(): fp = None pd = read_polydata_(fp) ren_win = vtkRenderWindow() ren_win.SetWindowName('GradientBackground') iren = vtkRenderWindowInteractor() renderers = [] modes = [ vtkViewport.GradientModes.VTK_GRADIENT_VERTICAL, vtkViewport.GradientModes.VTK_GRADIENT_HORIZONTAL, vtkViewport.GradientModes.VTK_GRADIENT_RADIAL_VIEWPORT_FARTHEST_SIDE, vtkViewport.GradientModes.VTK_GRADIENT_RADIAL_VIEWPORT_FARTHEST_CORNER, ] """ 模式(Mode),描述,渐变方向 VTK_GRADIENT_VERTICAL,垂直渐变,从底部 (SetBackground) 到顶部 (SetBackground2) 颜色过渡。 VTK_GRADIENT_HORIZONTAL,水平渐变,从左侧 (SetBackground) 到右侧 (SetBackground2) 颜色过渡。 VTK_GRADIENT_RADIAL_VIEWPORT_FARTHEST_SIDE,径向渐变(最远边),从中心 (SetBackground) 向视口最远的那条边进行径向扩散渐变,直到边缘变为 SetBackground2 的颜色。 VTK_GRADIENT_RADIAL_VIEWPORT_FARTHEST_CORNER,径向渐变(最远角),从中心 (SetBackground) 向视口最远的那个角进行径向扩散渐变,直到角落变为 SetBackground2 的颜色。 """ colors = vtkNamedColors() mapper = vtkPolyDataMapper() mapper.SetInputData(pd) actor = vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(colors.GetColor3d('Honeydew')) actor.GetProperty().SetSpecular(0.3) actor.GetProperty().SetSpecularPower(60.0) ren_width = 640 ren_height = 480 xmins = [0.0, 0.5, 0.0, 0.5] ymins = [0.0, 0.0, 0.5, 0.5] xmaxs = [0.5, 1.0, 0.5, 1.0] ymaxs = [0.5, 0.5, 1.0, 1.0] bottom_color = colors.GetColor3d('Gold') top_color = colors.GetColor3d('OrangeRed') left_color = colors.GetColor3d('Gold') right_color = colors.GetColor3d('OrangeRed') center_color = colors.GetColor3d('Gold') side_color = colors.GetColor3d('OrangeRed') corner_color = colors.GetColor3d('OrangeRed') viewport_title = ["Vertical", "Horizontal", "Radial Farthest Side", "Radial Farthest Corner", ] text_property = vtkTextProperty() text_property.SetJustificationToCentered() text_property.SetFontSize(ren_height // 12) text_property.SetColor(colors.GetColor3d('MidnightBlue')) text_mappers = [] text_actors = [] lb = [False, True, True, False] lbr = [False, True, True, True] tlb = [True, True, True, False] tlbr = [True, True, True, True] border_color = 'DarkGreen' border_width = 4.0 for i in range(0, 4): text_mappers.append(vtkTextMapper()) text_mappers[i].SetInput(viewport_title[i]) text_mappers[i].SetTextProperty(text_property) text_actors.append(vtkActor2D()) text_actors[i].SetMapper(text_mappers[i]) text_actors[i].SetPosition(ren_width / 2, 8) renderers.append(vtkRenderer()) renderers[i].AddActor(text_actors[i]) renderers[i].AddActor(actor) renderers[i].GradientBackgroundOn() renderers[i].SetGradientMode(modes[i]) renderers[i].SetViewport(xmins[i], ymins[i], xmaxs[i], ymaxs[i]) if i == 1: # Horizontal renderers[i].SetBackground(left_color) renderers[i].SetBackground2(right_color) viewport_border(renderers[i], lbr, border_color, border_width) elif i == 2: # Radial Farthest Side renderers[i].SetBackground(center_color) renderers[i].SetBackground2(side_color) viewport_border(renderers[i], tlb, border_color, border_width) elif i == 3: # Radial Farthest Corner renderers[i].SetBackground(center_color) renderers[i].SetBackground2(corner_color) viewport_border(renderers[i], tlbr, border_color, border_width) else: # Vertical renderers[i].SetBackground(bottom_color) renderers[i].SetBackground2(top_color) viewport_border(renderers[i], lb, border_color, border_width) ren_win.AddRenderer(renderers[i]) ren_win.SetInteractor(iren) ren_win.Render() iren.Initialize() iren.UpdateSize(ren_width * 2, ren_height * 2) iren.Start() if __name__ == '__main__': file_name = "" main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/2 17:22:39

MacPass:macOS原生KeePass客户端的全方位解析

MacPass:macOS原生KeePass客户端的全方位解析 【免费下载链接】MacPass A native macOS KeePass client 项目地址: https://gitcode.com/gh_mirrors/ma/MacPass 在当今数字安全日益重要的时代,MacPass作为专为macOS平台设计的原生KeePass客户端&…

作者头像 李华
网站建设 2026/3/7 3:32:28

SDXL-Turbo参数优化实战:快速掌握高质量AI图像生成技巧

SDXL-Turbo参数优化实战:快速掌握高质量AI图像生成技巧 【免费下载链接】sdxl-turbo 项目地址: https://ai.gitcode.com/hf_mirrors/stabilityai/sdxl-turbo SDXL-Turbo是Stability AI推出的高效文本到图像生成模型,以其惊人的单步生成能力和出色…

作者头像 李华
网站建设 2026/3/5 0:12:26

零基础新手漏洞挖掘入门指南:要啥技能、去哪挖、怎么挖?

零基础新手漏洞挖掘入门指南:要啥技能、去哪挖、怎么挖? 漏洞挖掘是合法合规的安全实践,核心是先学基础、再练靶场、合规实战,新手不用怕门槛高,按步骤推进就能逐步上手。 一、新手必备:3 大核心能力&…

作者头像 李华
网站建设 2026/3/7 22:29:30

基于体能分析的个性化健身方案生成

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

作者头像 李华
网站建设 2026/3/7 0:10:28

揭秘Memos暗黑模式:从零构建现代化深色主题系统

揭秘Memos暗黑模式:从零构建现代化深色主题系统 【免费下载链接】memos An open source, lightweight note-taking service. Easily capture and share your great thoughts. 项目地址: https://gitcode.com/GitHub_Trending/me/memos 在数字化时代&#xff…

作者头像 李华