You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:43:12