芙蕖吧 关注:497贴子:2,676
  • 20回复贴,共1

说下近期插件的动作文件导入探索情况

只看楼主收藏回复

一楼祭天


IP属地:北京1楼2020-09-07 10:06回复
    1、kf文件解析完成,导入未开始测试。
    2、xsm文件解析完成,导入完成度50%。
    3、hkx文件可以利用HavokContentTools转成文本形式,导入未开始测试。
    ==============================
    本次能有此进度的原因是测试发现,先打开blender249文件,保存blender290文件,新建空白blender291文件,追加前面保存的blender290,追加选择collection点击追加。这样blender291的软件界面是正常的,动画播放也正常。
    然后把location和旋转从blender里导出来xml文件。这个文件就是标准答案。
    以前一直在blender导入的文件,不得而入,这次因为有了标准答案,实现把位置正确的导入了进去。
    但问题也来了,旋转导入失败。
    导入旋转的测试过程,把edit_bone,pose_bone,bone的head, head_local,matrix, matrix_world,matrix_local, matrix_basis,matrix_channel,测试一遍。
    最终搞清楚了,在新建edit_bone,位于Armature space,xsm文件存储的数据位于bone space,bone space 转Armature space简单,问题出在了Armature space(local space) 转 pose space(object space),这个矩阵blender290是隐藏的,没有对外暴露。
    后期通过附加属性的形式,跟踪建立edit_bone,之前和之后的形式是不一样的,简单的建,我新建edit_bone的head是1个数据,blender建立edit_bone后,head_local是另外1个数据。按道理这2个数据应该是一样的,但现在是不一样和等效。
    所以到现在为止,告一个段落,目前已经把blender部分和xsm文件部分排除,问题锁定在建立edit_bone过程中,数据是被这样处理的。个人理解是Armature space(local space) 转 pose space(object space)矩阵。
    具体如何,准备去看blender源代码,学习与理解矩阵与源代码的时间没法把握。


    IP属地:北京2楼2020-09-07 10:28
    回复
      ==============================
      本次能有此进度的原因是在一次测试发现,先打开blender249文件,保存为blender290文件,再新建空白blender291文件,追加前面保存的blender290内容,追加时选择collection点击追加。这样blender291的软件界面是正常的,动画播放也正常。
      然后把location和旋转从blender里导出来xml文件。这个文件就是标准答案,有了比较的标杆。
      以前一直在blender导入的功能之外,不得其门而入,这次因为有了标准答案,终于实现了把位置正确的导入到blender。
      问题也来了,旋转导入失败。
      导入旋转的测试过程,把edit_bone,pose_bone,bone的head, head_local,matrix, matrix_world,matrix_local, matrix_basis,matrix_channel,normalized(),inverted(),convert_space(),convert_local_to_pose()测试一遍。(matrix_parent_inverse还没测试),最终搞清楚了问题发生在什么位置,在新建edit_bone,位于Armature space,xsm文件存储的数据位于bone space,bone space 转Armature space简单,问题出在了Armature space(local space) 转 pose space(object space)这个过程,这个转换矩阵blender290是隐藏的,没有对外暴露。
      后面通过附加属性的形式,跟踪建立blender建立edit_bone,其之前和之后的数据是不一样的,我新建edit_bone的head是1个数据,blender建立edit_bone后,edit_bone的head_local是另外1个数据。按道理这2个数据应该是一样的,但现在是不一样且等效(这2个数据还很接近)。
      所以到现在为止,插件探索告一个段落,当前已经把blender部分和xsm文件部分排除,问题锁定在建立edit_bone过程中,数据是怎样处理的。(个人理解是Armature space(local space) 转 pose space(object space)矩阵,对其进行了Z轴对其和规范,没有矩阵基础,数据不知道怎么处理)。
      具体如何,准备去看blender源代码,学习与理解矩阵与源代码的时间没法把握。
      之后,插件会停一段时间,破碎的时间学东西,总是学了又忘。现在的节奏,业余的时间沉浸学习太难,主要记忆力不行,1小时或2小时过去,只学习探索一点,就只能停下,明天继续,又忘了昨天的内容。只能慢慢来。(老师一般不会明说,在这方面你没有天赋,你可以去找你学得快的领域去学,不用和他死磕)


      IP属地:北京3楼2020-09-07 10:50
      回复
        最近了解到古剑奇谭网络版要更换虚幻引擎,心里有1种松了1口气的感觉。
        想了想,也感觉是自己一种时代的结束的心情。以后出来古剑4,我估计不会再有怕被剧透而赶紧通关的操作了。
        古剑1,2,3对我而言,像是一个时代。
        因为没有数学基础,所以一直有担心,探索过程中磕磕碰碰,现在想想当初简直不知道天高地厚就扎进去,关键是一天一点,结果没能做好。
        古剑4更换虚幻引擎,对插件而言,也代表着他的功能已经确定。插件不会在处理古剑4的文件,古剑4已经有了更好的插件。
        接下来,这个插件会继续探索动作文件的导入,
        等这些功能完成,这个插件的功能就不会在往古剑4扩展了。


        IP属地:北京4楼2020-09-07 11:09
        回复
          xsm文件的存储的数据实际是在parent_bone_space空间里,所以需要父级的数据和自身的数据叠加才能还原出Armature space(local space)的数据,xsm的骨骼数据,实际是存储在相对骨骼空间里,也就是blender里的pose_bone里的location和rotation_quaternion所在空间,他们也是相对空间,只是基点不一样。
          xsm的相对基点可以说是零,他们的数据贯穿local space,world space,且数据是一样的。
          pose_bone里的location和rotation_quaternion相对的是已经建立的骨架,所以xsm的所以数据,从相对零到相对骨架的数据变换下就是location和rotation_quaternion。对location是减法,对rotation_quaternion是inverted()。


          IP属地:北京5楼2020-09-07 11:26
          回复
            刚发现楼主开发的强大插件,正在摸索中,感谢楼主的付出,期待能支持动作的新版本。有个小白问题,我在挖掘古剑1,nif文件导入后,能用blender调骨骼吗?我对blender不熟悉呢


            IP属地:山东来自Android客户端6楼2020-09-10 09:06
            收起回复
              问题出在了Armature space(local space) 转 pose space(object space),这个矩阵blender290是隐藏的,没有对外暴露。
              卡在了同样的地方。 解决了吗? 能给点提示否?


              IP属地:陕西7楼2022-06-02 13:24
              收起回复
                好久之前搞过一个,导骨骼可以用导入的数据递归计算矩阵,导动画可以用bone.parent.matrix_local计算骨骼变化,另外Root骨骼也许可以忽略掉


                IP属地:广东8楼2022-06-03 12:56
                回复