如何用Python脚本在ParaView中逐场景创建动画并导出视频
在ParaView中用Python脚本逐场景创建并导出带旋转效果的动画视频
嘿,刚好我之前做过类似的ParaView动画脚本需求,给你拆解一下完整的实现思路和代码,完美匹配你说的“逐场景旋转后导出视频”的需求:
一、核心思路梳理
你已经在做的“加载VTK文件→执行旋转→切换场景”逻辑是对的,要实现导出,核心是给每个场景的旋转过程设置关键帧区间,然后要么导出每个区间的单独视频片段,要么把所有场景的动画合并成一个完整视频。
二、完整代码实现
下面是可直接运行的脚本(假设你的VTK文件按顺序命名,比如data1.vtk、data2.vtk),我加了详细注释:
# 导入ParaView Python模块 from paraview.simple import * # 关闭首次渲染自动重置相机(避免视角乱跑) paraview.simple._DisableFirstRenderCameraReset() # 替换成你的VTK文件列表,可按实际路径修改 vtk_file_list = ["data1.vtk", "data2.vtk", "data3.vtk"] # 获取或创建渲染视图 render_view = GetActiveViewOrCreate('RenderView') # 初始化动画场景 animation_scene = GetAnimationScene() animation_scene.PlayMode = 'Sequence' # 按序列模式播放 animation_scene.AnimationTime = 0.0 # 配置视频导出器(以MP4为例,需提前在ParaView设置中配置FFmpeg路径) video_writer = CreateWriter("full_animation.mp4") video_writer.View = render_view video_writer.FrameRate = 24 # 帧率,按需调整 video_writer.Quality = 90 # 视频质量,0-100 # 循环处理每个VTK文件(每个文件对应一个场景) for scene_idx, file_path in enumerate(vtk_file_list): # 1. 加载当前VTK文件 vtk_reader = LegacyVTKReader(FileNames=[file_path]) Show(vtk_reader, render_view) Render() # 渲染当前视图 # 2. 设置统一的初始相机视角(可选,确保所有场景起始视角一致) render_view.CameraPosition = [15, 15, 15] render_view.CameraFocalPoint = [0, 0, 0] render_view.CameraViewUp = [0, 1, 0] Render() # 3. 定义当前场景的动画时间区间(比如每个场景旋转持续2秒) scene_duration = 2.0 start_time = scene_idx * scene_duration end_time = start_time + scene_duration # 4. 设置旋转动画关键帧 # 初始状态关键帧 start_keyframe = CameraKeyFrame() start_keyframe.KeyTime = start_time start_keyframe.Position = render_view.CameraPosition start_keyframe.FocalPoint = render_view.CameraFocalPoint start_keyframe.ViewUp = render_view.CameraViewUp # 旋转完成后的状态关键帧 render_view.CameraAzimuth(360) # 绕Y轴旋转360度,可替换为CameraElevation实现上下旋转 Render() end_keyframe = CameraKeyFrame() end_keyframe.KeyTime = end_time end_keyframe.Position = render_view.CameraPosition end_keyframe.FocalPoint = render_view.CameraFocalPoint end_keyframe.ViewUp = render_view.CameraViewUp # 将关键帧添加到相机动画轨道 camera_track = GetCameraTrack(render_view) camera_track.KeyFrames = [start_keyframe, end_keyframe] # 更新动画场景的总时长 animation_scene.EndTime = end_time # ---- 如果需要单独导出每个场景的视频片段,取消下面注释 ---- # video_writer.FileName = f"scene_{scene_idx+1}_rotation.mp4" # video_writer.StartTime = start_time # video_writer.EndTime = end_time # video_writer.Write() # 导出完整的连续动画(所有场景连在一起) video_writer.Write() # 清理资源 Delete(vtk_reader) Delete(video_writer)
三、关键注意事项
- FFmpeg配置:导出MP4需要ParaView调用FFmpeg,你需要在
Edit → Settings → Rendering → FFmpeg中设置FFmpeg的可执行文件路径,不然会导出失败。 - 旋转方向调整:脚本中用的
CameraAzimuth是绕Y轴水平旋转,如果你需要垂直旋转,换成CameraElevation(angle)即可,角度按需设置(比如180)。 - 单独场景导出:如果不需要完整动画,只需要每个场景的旋转视频,取消代码中单独导出的注释,替换掉最后导出完整动画的部分就行。
- 序列帧转视频:如果ParaView导出视频有问题,也可以先导出PNG序列帧(用
WriteImage循环保存每帧),再用FFmpeg手动合并成视频,命令大概是:ffmpeg -r 24 -i frame_%04d.png -c:v libx264 -crf 20 -pix_fmt yuv420p scene_video.mp4
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

