bvh重定向流程

1.提取target的tpose并绑定humanik后保存为场景

        用bvhhacker可以直接在前面加一帧tpose,然后用blender实现bvh转fbx,导入maya后导出,取消勾选动画即可提取单帧tpose,再导进来创建角色定义手动绑定,然后导出为场景,这样humanik绑定才可以被保留。

2.source也设置第一帧为tpose后转成fbx

3.maya中导入target.mb与source.fbx(都是导入,选打开场景会出bug),现在其中一个绑定了骨骼而另一个没有

4.source创建角色定义手动绑定

5.设置好角色和源,两个骨架会自动同步(大的那个原来腿是叉开与肩同宽的,同步后就自动变成T型)

6.然后点播放就可以同步运动了

7.选择target导出为fbx

8.调整target的帧率使target运动节奏与对照的标准motion一致(只改变帧率不改变时长(实际运动速度))

        通过maya时间轴位置的帧率选择即可改变帧率,然后导出即可(但是导出240fps就会变成30fps一共80帧,但是其大小还是120fps的2倍(可能是用不动的填充了余下帧数))(为什么在烘培动画处填写的结束帧数没有任何用处:因为烘培的长度并不能用于裁剪,它是用来生成关键帧的)

import maya.cmds as cmds

# 设置动画的开始和结束帧

start_frame = 1

end_frame = 400

# 设置动画的时间范围

cmds.playbackOptions(min=start_frame, max=end_frame)

# 删除超出指定帧数的关键帧

all_objects = cmds.ls(type='transform')  # 获取所有变换节点

for obj in all_objects:

    cmds.cutKey(obj, time=(end_frame+1, 750), option="keys")  # 删除400帧之后的所有关键帧

用脚本裁剪吧,方便

把静止的裁完之后设置合适的帧率后在maya上的操作就完成了


9.删除由bvh转fbx时增添的多余的末端节点

import bpy# 确保在Object Mode下选择了Armature对象

if bpy.context.object.type == 'ARMATURE' and bpy.context.object.mode == 'OBJECT':

    bpy.ops.object.mode_set(mode='EDIT')

    armature = bpy.context.object.data

    # 查找并删除没有任何子节点的骨骼    

    bones_to_remove = [bone for bone in armature.edit_bones if len(bone.children) == 0]

    for bone in bones_to_remove:

        armature.edit_bones.remove(bone)

    bpy.ops.object.mode_set(mode='OBJECT')else:

    print("Please select an armature object in Object Mode.")

10.调整好的fbx导入blender,调整它的位移与旋转(bvh读进blender会自动绕x逆时针旋转90°,由y轴朝上变成z轴朝上)(bvh的世界坐标就是y up,-z forward(指朝屏幕里)),并导出

import bpy 

import math

# 确保当前在对象模式下选择了骨架对象

if bpy.context.object.type == 'ARMATURE' and bpy.context.object.mode == 'OBJECT':

    armature_obj = bpy.context.object

    # 顺时针旋转90度沿X轴(在Blender中,正值表示逆时针,所以使用-90度)

    armature_obj.rotation_euler[0] += math.radians(-90)

    # 向Y轴移动4米

    armature_obj.location[1] += 4.0

    # 确保变换被应用

    bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)

    # 设置导出路径

    export_path = "C:/Users/shionzhang/Desktop/output240.bvh"

    # 导出BVH

    bpy.ops.export_anim.bvh(filepath=export_path, check_existing=True, filter_glob="*.bvh", global_scale=1, frame_start=1, frame_end=400, rotate_mode='NATIVE')

    print(f"BVH file exported to {export_path}")

else:

    print("请在对象模式下选择一个骨架对象")

notice!:blender的动画导出长度是需要被设定的,如果手动导出的话则长度会被自动调整为时间轴的帧数范围(裁剪或填充)(也可以在导出时修改),脚本导出注意frame_end(所以在maya里也可以不裁剪,在这里设置导出长度就好)

你以为这就结束了?嗨嗨嗨

notice:1. 所有bvh在blender里都以固定帧率24帧播放,和它自己的帧率没关系

            2.fbx导出bvh会保留帧率,但是bvh导出bvh会固定24帧

        3.blender导出bvh的时候,手动导出注意勾选root translation only(这样通道数才匹配),注意需要的bvh的euler顺序(目前好像脚本实现不了root translation only)

        4.在objectmode对模型进行的平移和旋转没办法加在导出里(脚本中体现为少了这句bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)),但是脚本没法导出root translation only,所以最后的实现方法是用脚本做修改,然后手动导出


最终在blender里的操作

1.删多余节点

import bpy

# 确保你在Object Mode下,并且已经选择了需要修改的骨架对象

if bpy.context.object.type == 'ARMATURE' and bpy.context.object.mode == 'OBJECT':

    armature = bpy.context.object.data  # 获取骨架数据

    # 进入编辑模式

    bpy.ops.object.mode_set(mode='EDIT')

    # 遍历所有的骨骼

    bones_to_remove = [bone for bone in armature.edit_bones if len(bone.children) == 0]

    # 删除末端骨骼

    for bone in bones_to_remove:

        armature.edit_bones.remove(bone)

    # 返回对象模式

    bpy.ops.object.mode_set(mode='OBJECT')

else:

    print("请在对象模式下选择一个骨架对象")

2.做相应的变换

import bpy

import math

# 确保当前在对象模式下选择了骨架对象

if bpy.context.object.type == 'ARMATURE' and bpy.context.object.mode == 'OBJECT':

    armature_obj = bpy.context.object

    # 顺时针旋转90度沿X轴(在Blender中,正值表示逆时针,所以使用-90度)

    armature_obj.rotation_euler[0] += math.radians(-90)

    # 向Y轴移动4米

    armature_obj.location[1] += 4.0

    # 确保变换被应用

    bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)

else:

    print("请在对象模式下选择一个骨架对象")

3.手动导出,注意帧数范围,root translation only和euler顺序


处理动画时需要注意的几点:帧率、帧数、关节数、euler顺序、其他(比如bvh的通道数)

blender的其他坑:

1.所有bvh的root的offset都会在读入时默认置0

2.我的默认导入格式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容