
图形学数字人【免费下载链接】VRM-Addon-for-BlenderVRM Importer, Exporter and Utilities for Blender 2.93 to 5.2项目地址https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender点击查看免费下载导读VRM Animation.vrma是 VRM 规范体系中用于承载角色动作的动画文件格式它独立于模型文件本身允许你将一段动画从一个人物模型迁移到另一个人物模型上。本文以 VRM-Addon-for-Blender 官方动画文档为核心完整讲解在 Blender 中导出与导入 VRM Animation 的完整流程从前置条件VRM 1.0 骨架、被导出的动画数据范围到菜单操作、前置检查以及底层导出器与导入器在 vrm_animation_exporter.py 与 vrm_animation_importer.py 中的实现细节。读完本文你将掌握 VRMA 文件在 Blender 中的端到端工作流并理解其内部 GLB/glTF 结构、坐标系换算与关键帧重建原理。VRM Animation 是什么VRM Animation.vrma是由 VRMC_vrm_animation 1.0 扩展定义的动画格式基于 glTF 2.0 / GLB 二进制容器承载。它只描述动作不包含网格与材质因此可以脱离具体模型分发并在不同 VRM 模型之间复用。VRM-Addon-for-Blender 将其作为独立的导入/导出入口提供与模型文件.vrm相互独立通过File→Export→VRM Animation (.vrma)导出对应 EXPORT_SCENE_OT_vrma 操作符通过File→Import→VRM Animation (.vrma)导入对应 IMPORT_SCENE_OT_vrma 操作符。这两类操作还分别提供了前置检查操作符 WM_OT_vrma_export_prerequisite 与 WM_OT_vrma_import_prerequisite在正式打开文件对话框前先校验目标骨架是否满足 VRM 1.0 导出/导入条件。导出 VRM Animation 文件前置条件必须使用 VRM 1.0 骨架官方文档明确指出VRM Animation 的导出需要 VRM 1.0 的 Armature骨架。这一点在导出前置检查WM_OT_vrma_export_prerequisite.detect_errors中体现为两条硬性校验见 export_scene.py目标 Armature 必须存在且为 Armature 类型该 Armature 的 VRM 扩展版本必须为 VRM 1.0——如果检查到扩展不是 VRM 1.0会直接报错 Please set the version of VRM to 1.0请将 VRM 版本设置为 1.0在 VRM 1.0 的前提下Humanoid 骨骼必须完成正确指定否则报错 Please assign required human bones请指定必需的 Humanoid 骨骼。检查通过后才会弹出保存对话框检查不通过时操作会改为调用前置检查对话框列出所有错误并提示你逐个修正。导出内容与数据范围官方文档列出了 .vrma 文件实际包含的动画数据共三类Humanoid 骨骼的旋转值rotationVRM Humanoid 体系内各骨骼的旋转动画Humanoid Hips 骨骼的移动值translationHips 骨骼人体重心的位移动画Expression 的预览值preview value面部表情 BlendShape 的预览数值注意Look At 注视方向数值目前尚不支持导出。配套的英文 UI 文档 docs/en-us/ui/export_scene.vrma/index.md 对导出内容做了更精确的表述满足以下条件的动画会被导出为 VRMA 文件——分配给 VRM Humanoid 骨骼的骨骼旋转值、分配给 Hips 骨骼的平移值、VRM Expression 的预览值以及 VRM Look At 的 Preview Target 中指定对象的平移值。也就是说Look At 目标物体的位移动画而非 Look At 的朝向角度本身也会被写入文件。源码级导出实现导出入口 VrmAnimationExporter.execute 的执行流程如下在导出前自动将骨架切换到 T-Pose调用setup_humanoid_t_pose并保存当前工作区状态save_workspace(context, armature, modePOSE)导出结束后恢复调用_export_vrm_animation生成完整的 VRMA 二进制内容最后通过path.write_bytes(output_bytes)落盘。核心函数_export_vrm_animationvrm_animation_exporter.py内部的构建过程可以分为四条数据生产线骨骼节点与坐标系换算_create_node_dicts从 VRM 1.0 的 Humanoid 骨骼规格HumanBoneSpecifications出发以 Hips 为根递归生成 glTF 节点树每块骨骼的平移与旋转会做 Blender右手、Z-up到 glTF右手、Y-up的坐标系换算——平移从(x, y, z)变为(x, z, -y)四元数从(x, y, z, w)变为(x, z, -y, w)Humanoid 骨骼旋转动画_create_node_animation逐帧调用armature.pose.apply_pose_from_action(action, evaluation_timeframe)求值动作随后递归收集每个 Humanoid 骨骼相对父骨骼的旋转四元数_set_frame_rotations。如果某块骨骼在整个时间范围内旋转角都近似为零abs(quaternion.angle) float_info.epsilon该骨骼的 rotation 通道会被跳过不导出以减小文件体积Hips 位移动画同一函数中逐帧记录 Hips 骨骼的平移向量若所有帧的位移长度平方都小于浮点精度阈值则同样跳过Expression 预览动画_create_expression_animation从 Armature data 的 Action 中读取 Expression 的preview曲线将每个 Expression 映射为一个独立的动画节点并把预览值钳制在[0, 1]区间后写入translation通道。所有 Expression 节点会同时挂入场景节点列表scene_node_indices保证导入方能够定位到它们。最终vrma_dict会被组装为标准的 GLB 结构asset含生成器标识 VRM Add-on for Blender v版本号、nodes、scenes、animations、buffers/bufferViews/accessors以及extensionsUsed: [VRMC_vrm_animation]与对应的extensions扩展块随后由pack_glb打包为 .vrma 二进制文件。值得注意的是时间轴采样使用frame_to_timestamp_factor fps_base / fps将帧号换算为秒级时间戳因此动画时长严格依赖场景的渲染帧率设置context.scene.render.fps/fps_base。在默认 24 fps 下1 秒动画对应 24 帧。实际操作步骤在 Blender 中导出 VRMA 的最小流程对应原文档中的 15 张步骤截图为在场景中放置一个已完成 VRM 1.0 设置、Humanoid 骨骼指定正确的模型 Armature选中该 Armature进入 Pose 模式为需要导出的骨骼旋转、Hips 位移与 Expression 预览值制作关键帧动画执行File→Export→VRM Animation (.vrma)在前置检查对话框中确认目标 Armature默认取当前激活的 Armature核对错误列表为空选择保存路径确认文件扩展名为.vrma点击Save完成导出。导出的 .vrma 文件即可被支持 VRMC_vrm_animation 的应用或引擎播放或在 Blender 中再次导入复用。导入 VRM Animation 文件导入行为与自动建模官方文档及配套 UI 文档 docs/en-us/ui/import_scene.vrma/index.md 描述了导入流程通过File→Import→VRM Animation (.vrma)打开导入对话框选择一个 VRMA 文件并点击Open后动画会应用到当前场景中的 VRM 1.0 模型上如果当前场景中没有 VRM 1.0 模型插件会自动生成一个最小化模型minimal model来承载动画。从源码看这一自动生成逻辑位于 IMPORT_SCENE_OT_vrma.execute当找不到目标 Armature 时会调用ops.icyp.make_basic_armature()创建一个基础 Armature并自动将其扩展版本设置为 VRM 1.0ext.spec_version ext.SPEC_VERSION_VRM1然后继续执行导入。与导出对称导入前置检查同样要求目标 Armature 必须是 VRM 1.0且 Humanoid 骨骼已正确指定import_scene.py。源码级导入实现导入入口 VrmAnimationImporter.execute 的核心步骤与导出一致先切 T-Pose 并保存工作区导入结束后恢复 Look At 预览开关状态_import_vrm_animation完成主要工作返回{FINISHED}。_import_vrm_animationvrm_animation_importer.py是导入端的中枢其处理链路包括GLB 解析通过parse_glb读取 .vrma 二进制得到 JSON 字典与 buffer 数据结构校验依次校验nodes、animations.channels、animations.samplers、extensions.VRMC_vrm_animation.humanoid.humanBones等字段是否存在且类型正确缺失即返回{CANCELLED}Hips 节点索引必须在节点数组范围内节点映射解析humanBones与expressionspreset/custom映射表建立节点索引 → Humanoid 骨骼名/Expression 名的对应关系通过_find_root_node_index沿 children 链向上回溯找到整棵节点树的根节点静止姿势重建NodeRestPoseTree.build将 glTF 节点树还原为 Blender 坐标系下的静止姿势矩阵把平移(x, z, -y)与四元数(w, x, -z, y)换算回 Blender 约定采样数据读取利用read_accessor_as_animation_sampler_input等工具从 accessor/bufferView/buffer 中读回各通道的时间戳、平移与旋转关键帧数据并按时间戳排序Action 与关键帧写入为 Humanoid 骨骼创建名为 Humanoid 的 Action为 Expression 创建名为 Expressions 的 Action在时间范围内逐帧插值平移用线性插值lerp、旋转用球面插值slerp调用_assign_humanoid_keyframe、_assign_expression_keyframe、_assign_look_at_keyframe为骨骼、Expression 预览值和 Look At 目标物体写入关键帧Hips 特殊处理若文件中包含 Hips 位移动画导入结束后会进入 Edit 模式将 Hips 骨骼与其父骨骼的use_connect连接断开——这是为了让 Hips 的位移动画能够被正确反映连接状态下的骨骼移动会被父骨骼约束吸收源码注释明确说明此步必须放在最后执行因为会改变骨骼状态。导入时的帧号换算同样依赖场景帧率frame_count timestamp * fps / fps_base即 VRMA 中的秒级时间戳按当前场景帧率映射为 Blender 帧号。导入后的产物导入完成后Blender 场景中将出现目标 Armature或自动生成的最小模型上带有 Humanoid Action 的骨骼旋转/位移动画Armature data 上带有 Expressions Action 的 Expression 预览动画自动关联到 VRM Expression 的preview属性若文件包含lookAt扩展且该节点存在位移动画会新建一个名为 LookAtTarget 的空物体Empty作为 Look At 的 Preview Target显示尺寸 0.125自动开启 Look At 预览look_at.enable_preview True并写入其位置关键帧。验证与测试仓库在 tests/importer/test_vrm_animation_importer.py 中提供了完整的导入测试套件可用于验证上述行为测试通过pack_glb手工构造包含 rotation/translation 通道的最小 VRMA 文件write_animation再调用VrmAnimationImporter.execute导入到make_basic_armature生成的 VRM 1.0 骨架上test_world_rotation_with_object_rotation验证了当 Armature 物体自身带有旋转、甚至作为子物体被父物体旋转时导入后的每帧骨骼世界旋转仍与参照模型一致且 Armature 的matrix_world与静止姿势matrix_local在导入前后保持不变——这印证了导入器会妥善处理物体变换与静止姿势分离测试还覆盖了 Hips 位移动画导入后自动断开use_connect的行为Disconnecting hips enters edit mode。在基准测试目录 benchmarks/src/io_scene_vrm_benchmarks/vrma_import_benchmark_test.py 中还可以看到通过ops.import_scene.vrma(filepath...)批量导入内置benchmark.vrma文件的性能测试用例其中包含多次连续导入以衡量重复导入的耗时表现。命令行 / 脚本调用除菜单操作外VRMA 的导入导出也支持通过 Python 脚本直接调用对应自动生成的类型化包装 common/ops/export_scene.py 与 common/ops/import_scene.py# 导出导出 VRM 1.0 骨架的动画 bpy.ops.export_scene.vrma( filepath/path/to/output.vrma, armature_object_nameArmatureName, ) # 导入将动画应用到当前场景中的 VRM 1.0 模型 bpy.ops.import_scene.vrma( filepath/path/to/input.vrma, armature_object_nameArmatureName, )两个操作符共有的参数参数类型说明filepathstr输出/输入文件的完整路径扩展名.vrmaarmature_object_namestr目标 Armature 的物体名留空时自动选择当前激活的 Armaturefilter_globstr文件过滤器默认*.vrma隐藏属性导入时若armature_object_name留空且场景中找不到 VRM 1.0 骨架会自动生成一个最小 VRM 1.0 模型来承接动画与菜单流程行为一致。总结围绕 VRM Animation 的导入导出VRM-Addon-for-Blender 提供了完整且自洽的实现闭环导出端以 VRM 1.0 骨架为前提将 Humanoid 骨骼旋转、Hips 位移、Expression 预览值以及 Look At 目标物体位移采样为 glTF 动画通道打包为 VRMC_vrm_animation 1.0 扩展的 GLB 文件导入端解析 GLB 后重建节点树与静止姿势通过逐帧插值把动画写回 Blender 的 Action 与关键帧并针对 Hips 连接、物体变换、场景帧率等细节做了专门处理验证端仓库提供独立的导入测试与基准测试覆盖坐标系换算、物体旋转/父级变换、Hips 断开连接等边界场景。需要特别留意的限制是Look At 注视方向的数值本身目前尚未支持导出仅支持导出 Look At 目标物体的位移动画Humanoid 左右眼骨骼的旋转也不会被导出。在你将 VRMA 动画迁移到不同模型时请确保目标模型同样是 VRM 1.0 且 Humanoid 骨骼指定完整以保证动画能正确映射。赞分享图形学数字人【免费下载链接】VRM-Addon-for-BlenderVRM Importer, Exporter and Utilities for Blender 2.93 to 5.2项目地址https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender点击查看免费下载相关推荐VRM-Addon-for-Blender 动画实战VRMA 文件的导入、导出与源码级数据链路解析VRM Addon for Blender 动画实战VRMA 文件的导入、导出与源码级数据链路解析 VRM Animation .vrma 是 VRM 1图形学数字人VRM-Addon-for-Blender VRM Animation (.vrma) 导出完全指南导出流程、数据范围与底层实现解析VRM Addon for Blender VRM Animation .vrma 导出完全指南导出流程、数据范围与底层实现解析 本文以 VRM Add on图形学数字人Roc 语言容错 UTF-8 解码深入解析Str.from_utf8_lossy 与 REPL 快照测试Roc 语言容错 UTF 8 解码深入解析Str.from_utf8_lossy 与 REPL 快照测试 导读 Str.from_utf8_lossy 是 R图形学数字人上一篇JoyCon-Driver创新应用技术指南释放Switch手柄的跨平台潜力下一篇60s API智能数据聚合平台让全网资讯触手可及创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考