Blender的Python编程介绍

在Blender这个免费的开源3D设计软件中,最值得称道的一点是可以用Python程序来辅助进行3D设计,我们可以通过Python来调整物体的属性,生成新的物体,甚至生成新的动画等等。

在最近的一个项目中,我用Blender制作了一个动画,但是由于前期设计的时候,骨骼的大小设置的不对,现在想重新调整骨骼的大小,发现只能把缩放应用到增量中,否则的话会对物体的形体位置有破坏。例如下图是变换增量中xyz缩放为30,缩放xyz为0.01的3D物体:

如果我想调整变换增量xyz缩放为1时, 缩放xyz仍然为0.01,然后物体大小保持不变,那么我会做以下几步的修改:

  1. 设置变换增量xyz缩放为1, 缩放xyz为0.3,然后按ctrl-A应用缩放,把缩放xyz调整为1

  2. 设置缩放xyz为100,然后按Ctrl-A应用缩放,把缩放xyz调整为1

  3. 设置缩放xyz为0.01

做完以上操作后,物体的大小不变,但是骨骼的位置会发生变化,导致物体形变,如下图:

分析后得知,在进行以上调整时,对于一些有骨骼约束,例如IK约束的骨骼,其位置XYZ并没有机型相应的扩展。例如对于手部IK骨骼来说,假设调整前其XYZ分别为0.1m, 0.2m, 0.3m,则调整后应该放大30倍才对,即XYZ应为3m, 6m, 9m。考虑到这个设计里面有很多动画,每个动画都有很多关键帧,如果每个关键帧都手动修改骨骼的位置,工作量很大也容易出错,这时可以考虑用Python脚本来帮助我们完成这个调整。

在blender的菜单中点击脚本,即打开一个文本编辑的窗口,可以输入Python代码,点击菜单的窗口,打开系统控制台。然后在文本编辑中输入以下代码,就能自动调整所有动画中相关骨骼的位置数据:

python 复制代码
import bpy

bones = ["weapon", "mag", "bolt", "base", "bolt1", "hand_IK_L.L", "hand_IK_L.R", "shoulder_L.L"]

for action in bpy.data.actions:
    for fcurve in action.fcurves:
        for bone in bones:
            if fcurve.data_path == 'pose.bones["' + bone + '"].location':
                for keyframe in fcurve.keyframe_points:
                    x, y = keyframe.co 
                    fcurve.keyframe_points.insert(x, y*30) 

解释一下以上的代码, 在bpy.data.actions里面保存了所有的动画Action,每个action都有一个fcurves(函数曲线),这个对应的是每个骨骼的动画信息。我们可以通过fcurve.data_path来判断,例如fcurve.data_path为pose.bones["weapon"].location,这表明对应的furve是weapon骨骼的位置信息,这时可以通过fcurve.array_index来进一步判断对应的是xyz的哪一个。如果要查看动画里面每一个关键帧的骨骼的位置数据,可以通过遍历fcurve.keyframe_points来查看,通过keyframe.co获得一个(x,y)的tuple,其中x代表关键帧的帧数,y是对应的数值。例如对于一个fcurve是对应weapon这个bone的location,那么其keyframe.co为(12, 0.6)表示在第12帧,这个bone的location为0.6m。最后通过furve.keyframe_points.insert方法,即可更新或新增一个关键帧并设置数值。对于以上的应用,当运行这个脚本之后,可以看到现在骨骼的位置都调整正确了,如下图:

相关推荐
穷人小水滴3 天前
编写 blender python 扩展 (extension / addon)
python·3d·开源·blender·扩展
就叫飞六吧5 天前
四款主流的3D创作和游戏开发软件的核心特点和关系
unity·blender
Raina_H6 天前
Blender进阶:贴图与UV
经验分享·3d·blender·贴图·uv
Raina_H6 天前
Blender进阶:着色器节点
3d·blender·材质·贴图·着色器·uv
碎像21 天前
blender 理解 积木组合 动画制作 学习笔记
blender
穷人小水滴21 天前
(科幻) 人形物体的 3D 建模
3d·机器人·blender·科幻
巽星石1 个月前
【Blender Python】5.Blender场景中的集合
python·blender·集合
巽星石1 个月前
【Blender Python】6.修改物体模式
python·blender
穷人小水滴1 个月前
交通工具等物体的 3D 建模 (科幻游戏 《外卖员模拟器》)
游戏·3d·blender·设计·建模·科幻
巽星石1 个月前
【Blender Python】7.一些运算、三角函数以及随机
python·blender·三角函数·随机·环形阵列