news 2026/5/28 18:41:12

Rotations 物体绕轴旋转

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rotations 物体绕轴旋转

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①物体如何绕轴旋转,②渲染的擦除功能EraseOff


二:代码及注释

import time import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkRenderingCore import vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, vtkPolyDataMapper, vtkActor from vtkmodules.vtkIOPLY import vtkPLYReader from vtkmodules.vtkIOXML import vtkXMLPolyDataReader from vtkmodules.vtkIOGeometry import vtkOBJReader, vtkSTLReader, vtkBYUReader from vtkmodules.vtkFiltersGeneral import vtkAxes from vtkmodules.vtkFiltersSources import vtkSphereSource def ReadPolyData(file_name): import os path, extension = os.path.splitext(file_name) extension = extension.lower() if extension == '.ply': reader = vtkPLYReader() reader.SetFileName(file_name) reader.Update() poly_data = reader.GetOutput() elif extension == '.vtp': reader = vtkXMLPolyDataReader() reader.SetFileName(file_name) reader.Update() poly_data = reader.GetOutput() elif extension == '.obj': reader = vtkOBJReader() reader.SetFileName(file_name) reader.Update() poly_data = reader.GetOutput() elif extension == '.stl': reader = vtkSTLReader() reader.SetFileName(file_name) reader.Update() poly_data = reader.GetOutput() elif extension == '.vtk': reader = vtkXMLPolyDataReader() reader.SetFileName(file_name) reader.Update() poly_data = reader.GetOutput() elif extension == '.g': reader = vtkBYUReader() reader.SetGeometryFileName(file_name) reader.Update() poly_data = reader.GetOutput() else: # Return a sphere if the extension is unknown. source = vtkSphereSource() source.Update() poly_data = source.GetOutput() return poly_data def RotateX(renWin, actor): actor.SetOrientation(0, 0, 0) for i in range(0, 6): time.sleep(1) actor.RotateX(60) renWin.Render() renWin.EraseOn() def RotateY(renWin, actor): actor.SetOrientation(0, 0, 0) for i in range(0, 6): time.sleep(1) actor.RotateY(60) renWin.Render() renWin.EraseOn() def RotateZ(renWin, actor): actor.SetOrientation(0, 0, 0) for i in range(0, 6): time.sleep(1) actor.RotateZ(60) renWin.Render() renWin.EraseOn() def main(): file_name = "Data/cow.obj" figure = 10 actor_color = "Wheat" colors = vtkNamedColors() colors.SetColor("BkgColor", (26, 51, 102, 255)) ren1 = vtkRenderer() renWin = vtkRenderWindow() renWin.AddRenderer(ren1) iren = vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) polyData = ReadPolyData(file_name) modelMapper = vtkPolyDataMapper() modelMapper.SetInputData(polyData) modelActor = vtkActor() modelActor.SetMapper(modelMapper) modelActor.GetProperty().SetDiffuseColor(colors.GetColor3d(actor_color)) if actor_color != 'Wheat': modelActor.GetProperty().SetSpecular(0.6) modelActor.GetProperty().SetSpecularPower(30) modelAxesSource = vtkAxes() modelAxesSource.SetScaleFactor(10) modelAxesSource.SetOrigin(0, 0, 0) modelAxesMapper = vtkPolyDataMapper() modelAxesMapper.SetInputConnection(modelAxesSource.GetOutputPort()) modelAxes = vtkActor() modelAxes.SetMapper(modelAxesMapper) ren1.AddActor(modelAxes) ren1.AddActor(modelActor) if actor_color == 'Wheat': ren1.SetBackground(colors.GetColor3d('BkgColor')) else: ren1.SetBackground(colors.GetColor3d('Silver')) renWin.SetSize(640, 480) renWin.SetWindowName('Rotations') ren1.ResetCamera() ren1.GetActiveCamera().Azimuth(0) ren1.GetActiveCamera().SetClippingRange(0.1, 1000.0) renWin.Render() if figure == 1: RotateX(renWin, modelActor) elif figure == 2: RotateY(renWin, modelActor) else: RotateZ(renWin, modelActor) """ EraseOff 关闭擦除功能 在3D渲染和动画中,一个基本的步骤是:在渲染新的一帧之前,必须将渲染窗口的整个背景和旧图像擦除(或清除)干净 默认行为: 擦除开启 步骤:清除屏幕 → 绘制新的一帧(物体的新位置)→ 显示 效果: 产生平滑、连续的动画效果。 关闭擦除: 步骤: 不清除屏幕 → 直接在旧图像上绘制新的一帧(物体的新位置)→ 显示。 效果: 每次渲染的物体图像都会保留在屏幕上,形成一种 “残影” 或 “轨迹叠加” 的效果。物体在连续运动中所经过的路径会被全部显示出来 """ renWin.EraseOff() iren.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 18:22:21

【C#网络通信协议深度解析】:掌握高性能Socket编程的5大核心技巧

第一章:C#网络通信协议概述在现代软件开发中,C# 作为 .NET 平台的核心语言之一,广泛应用于构建高性能的网络通信应用。其强大的类库支持和异步编程模型,使得开发者能够高效实现基于 TCP、UDP 和 HTTP 等协议的数据传输。核心通信协…

作者头像 李华
网站建设 2026/5/20 9:42:12

ReAct架构深度解析:让智能体“边思考边行动”的实战范式

本文同步更新于公众号:AI开发的后端厨师,本文完整代码开源github:https://github.com/windofbarcelona/all-agentic-architectures-golang/tree/main/03_react 本文同步更新于公众号:AI开发的后端厨师,本文完整代码开源…

作者头像 李华
网站建设 2026/5/20 9:42:52

C# 12拦截器异常全解析,深度解读编译时AOP的致命短板

第一章:C# 12拦截器异常全解析,深度解读编译时AOP的致命短板C# 12 引入的拦截器(Interceptors)特性标志着编译时面向切面编程(AOP)在语言层面的初步尝试。该机制允许开发者在编译阶段将特定方法调用重定向至…

作者头像 李华
网站建设 2026/5/20 23:25:17

从单一残差流,看懂 Prompt 为什么“能工作”

引子:Prompt 真的是“指令”吗?几乎所有人第一次被 Prompt 震到,都是在某个瞬间意识到: 我并没有教模型新知识,它却突然换了一种思考方式。不是模型升级,不是微调,也不是参数变化。 只是多写了几…

作者头像 李华
网站建设 2026/5/24 8:57:00

为什么顶级团队都在改用C#集合表达式处理数组?真相令人震惊

第一章:Shell脚本的基本语法和命令Shell脚本是Linux/Unix系统中自动化任务的核心工具,通过编写可执行的文本文件,用户能够批量执行命令、管理文件系统、监控进程等。一个标准的Shell脚本通常以“shebang”开头,用于指定解释器路径…

作者头像 李华