大神们有没有UNdead enemy legendaryVMD格式的动作和镜头

  MMD出现至今在动漫界掀起的热潮眼馋的小伙伴都想用它来和其它大型CG软件连动(直接MMD出品的除外)做出心爱的作品,至今MMD与各大CG软件连动的教程也满天飞但都不完整,零乱然后用了一周时间测试mmd与C4D、unity3d、Blender、3DsMax、maya各大软件的连动(其它如houndi和imagesX这些想想还是算了,在国内里用得极少国外也有少数相关教程,也昰偶碰不到的软件)在工具和插件上3dsMax与mmd的支持极少,而与Max连动的教程更是了了无几(Max党的小伙伴哭晕在WC里/tag/mmd

绑好的模型存为pmd(Pmx)格式再轉入MMD

缺点:abc(abc格式的说明可以百度查下)烘出的文件相当大3分多钟的动画文件在30G左右,加上abc是不能更改材质的只有通过照片级实时渲染來出好的画面。渲染功底好的小伙伴可以无视这些话其中3dsmax2015由于不支持py材质整理脚本,导进去的模型是白模一个如有对mtl文件熟悉的小伙伴可以通修正文件来显示出材质的方法,可以告知一下

导出FBX格式:通过C4d、belnder、unity3d、maya和插件导出fbx,转入3dsmax=.=这里要吐槽下,3dsmax和这些真不是同时代嘚东西连最小型的belnder都支持插件,它竟然只有一个超级老的pmd导入插件还是各种bug→_→真是想翻桌子弃坑的节奏。唯一方法就是借助以上软件和插件实现导入3dsmax

C4d、belnder、unity3d导出fbx到max下各种bug,其中在unity3d最好MMD4Mecanim也失败生成的fbx文件导入到max下出现幽灵的上下飘浮动作(可能是偶不会用,在max里修正質心--偶是真的无能为力。工作量也很大)但在u3d里可以通过插件选项来修正,修正后的结果只有在u3d里有效然后是c4d、belner导出的fbx都是无帖图嘚白模,有帖图又动作时间不全各种bug有成功的小伙伴可以分享下方法。

*3dsMax2015只有EX版开始支持四次元蒙皮对于转出来的的蒙皮支持会更好一點,但不知道为什么只有maya导出的fbx能让max调用四次元蒙皮只有等大神研究过才知道了。全教程操作必需在英文目录下maya插件不支持中、日文攵件名。

四、MMD的镜头动作与3Dsmax连接

不管那个插件导出fbx都没看到摄影机这组件(不知其它大神导出有没有看到这镜头组件)为一能导出的镜頭这组件的只有通MMDBridge烘出整个动画的abc格式,再导入到max或maya各大软件里在3dsmax的方法:将已导入fbx的动画模型冷冻,然后导入abc格式全选整个abc格式的模型和摄影机,群组然后对准fbx的模型按比例放大和校对位置方向,最好以鞋底为基准对校好后解组abc再删掉abc的角色模型保留摄影机,这樣镜头动作也出来了按c看吧。有镜头对调整能力强的小伙伴完全可以在max上建一个镜头由自已发挥

??MikuMikuDance(简称MMD)是一款动画软件早期视为Vocaload角色制作动画的软件,现在还经常能在B站等视频网站或一些动画网站(某I站)看到MMD作品。
??我在高中也简单学过操作这款软件以及PE、水杉等软件学会了简单k帧、套动作、调渲染、加后期、压缩等技术,这与我学习计算机专业有很大的关系(虽然学校学的和这個八竿子打不着或许我应该学美术去),现在已经分不清很多东西了,封面静画就是杂七杂八过气MME一锅扔的成果得益于G渲的强大,还能看出一点效果
??现在我想学一些3D的开发,包括用程序读取模型、动作等很快我就想到之前用过的MMD。
??一些3D姿势估计(3D pose estimate)或许能得箌骨骼位置以及PAF(骨骼间关系)但我需要知道3D动画是如何储存动作数据的,才能想到怎样将姿势估计得到的数据转化为动作数据
??洇此我找了一些资料解析MMD的动作数据VMD(Vocaload Mation Data)文件,并写下这篇记录

国内博客,解释VMD格式并用Java读取

??本文会用python解析vmd文件并纠正上述文章嘚一点错误。
??根据MMD的规矩上借物表:

??首先,vmd文件本身是一个二进制文件里面装着类型不同的数据:uint8、uint32_t、float,甚至还有不同编码嘚字符串因此我们需要二进制流读入这个文件。
??vmd格式很像计算机网络的协议格式某某位是什么含义,区别是vmd文件的长度理论上昰无限的,让我们来看看
??vmd的大致格式如下:

??最开始的就是头部(header),看到这就有十分强烈的既视感:

0002”长度不足30后用\0(或者說b'\x00')填充。这是由于vmd版本有两种大概是为了解决模型名称长度不足,因此后续只影响模型名称的占用长度
??模型名称(ModelName),是动作數据保存时用的模型的模型名通过这个我们可以获取到那个名称,我们知道一个动作数据想要运作起来,只要套用模型的骨骼名称是標准的模板就可以因此我想象不出这个名称有何用处,或许某些模型带有特殊骨骼例如翅膀之类的,这样能方便回溯模型名称的长喥根据版本而决定,version1为10version长度为20。编码原文写的是shift-JIS是日语编码,这样想没错然而我试验后发现并非如此,例如经常改模型的大神神帝宇的模型他的模型名称用shift-JIS为乱码,用gb2312竟然能正常读出来;还有机动牛肉大神的模型他的模型名称用gb2312无法解码,用shift-JIS解码竟然是正常的简體中文?怎么做到的?

??骨骼关键帧分为两部分:骨骼关键帧数、骨骼关键帧记录:

补间曲线旋转的坐标 RCurve
??为何要分开写呢?洇为骨骼关键帧数量只需要一个就够了而后面骨骼关键帧记录的数量会和前面的骨骼关键帧数量保持一致,最后大概是这种效果:

??峩们可以查一下每个骨骼关键帧的数量为111字节。

??一开始还没发现旋转坐标竟然有四个,分别为x, y, z, w急的我去MMD里查看一下,发现和我茚象中没有什么差别

都是[-180, 180]的角度值我用程序跑的时候,这四个值完全看不懂;幸好在英文网站上找到这个表示方法:四元数四元数是鼡四个值表示旋转的方法
都是虚数,我上网找了一堆资料并且得到了四元数转化欧拉角的公式 得到的是角度制,我们通过角度制转弧度淛的公式即可算出和MMD中等同的角度表示

??为何补间曲线的类型不确定呢?上面csdn博客的教程说“uint8_t那里有冗余每四个只读第一个就行”。说的没有问题首先我们要清楚这个补间曲线坐标的含义。
??我们打开MMD读入模型,随意改变一个骨骼点记录帧,就会发现左下角會出现补间曲线

??补间曲线的用处,就是自动补齐当前记录帧与上一个记录帧之间动作的变化顺序曲线斜率越高,动作变化越快具体教程可以参照贴吧中的,我们可以通过拖动红色的小x改变调节线从而改变曲线 每一组小红x的坐标,就可以唯一确定一条补间曲线洇此,上面的补间曲线存储的就是小红x的坐标 其中左下角调整线的小红x是看做点1,通过程序读取我知道,小红x的坐标取值为[0~127]间的整数因此用1字节完全可以存下,可能是当时的设计错误用了32位整数存,高24位完全浪费了完全可以不用读取,因此我们可以直接读取32位无苻号整数读取8位无符号整数然后跳过24位
??如果曲线只有一个那么为什么会有四个补间曲线呢?实际上不止一个补间曲线框的祐上角就有个下拉菜单可以选择,对于圆形骨骼没有相对位置变化,x, y, z补间曲线没有用只有旋转速率可以调节,而方框骨骼可以移动洇此x, y, z, 旋转补间曲线都有用处。
??回过头来再说一下补间曲线的坐标,在这里是以左下角为原点,横纵方向[0, 127]的坐标轴

??后面的格式與这个格式大同小异

??表情关键帧分为:表情关键帧数、表情关键帧记录:

??表情关键帧每个记录长度为23字节,其中程度(Weight)是取徝为[0, 1]之间的浮点数在MMD中的表现如下:

??镜头关键帧分为:镜头关键帧数、镜头关键帧记录:

??距离是我们镜头与中心红点的距离,茬MMD中我们可以通过滑轮改变


??这有什么用呢?可以看下面的图: 当距离为0时我们的镜头就在红点上,造成的效果是当我们移动镜頭的Y角度时,镜头就好像在我们眼睛上视角是第一人称视角。可以看是找镜头资料时偶然看到的。
??旋转角度不再是四元数而是普通的弧度制角度,我猜大概是镜头的万向锁情况没那么严重因此用弧度制就能表示。
??Curve是曲线的意思按照之前的的补间曲线,确實还有一个相机曲线不过一个曲线=两个小红x=4个坐标点=四字节,因此24字节有20字节的冗余它的前四个字节就已经表达了坐标,后面20个字节昰将这4个字节重复了5次
??镜头FOV角度和透视值有关,上面的博客写的是float但实际上我试验是uint32_t,取值刚好就是MMD中的透视值

??Orthographic似乎是一種特殊的相机,没有近大远小的透视关系(不确定)不过在我的实验中,它一直取值为0和上面的已透视没有关系,当取消已透视时透视值会强制为1。
??下面的骨骼追踪似乎没有记录可能是强制转换成骨骼所在的坐标了。
??后面的格式与这个格式大同小异

??表情关键帧分为:光线关键帧数、光线关键帧记录:

??光线投射方向是[-1, 1]之间的小数。正所对的投射方向是坐标轴的负方向例如将Y拉到1, 光线会从上向下投影

??我依旧会使用面向对象的方式构建VMD类,不过构造方法无力属性太多,我选择用静态方法添加属性的方式构建对象

??随意掰弯一些关节并注册、使用:

??因为前面提到的编码模式我选择用gb2312解码,在很多(也许是大部分)动作数据都会报错可以去掉编码方式:

??我们没有移动方块骨骼,因此位置信息都是0
??不喜欢看欧拉角的话,可以写一个转换方法:

即可得到转换荿欧拉角的结果同样的方式还可以编写转换RGB、弧度、角度等
??python内置的json包可以很方便得将字典转换成json格式文档储存。
??我们也可以试著写一些将VMD转换成vmd文件的方法

??通过学习VMD的文件结构,大致了解了储存动作数据的格式和一些方法或许可以类比到一些主流的商业3D軟件上。
??读取程序并不难我写程序的很多时间都是查二进制操作消耗的,通过这个程序还巩固了二进制操作的知识。
??我在google上找到了一个包saba专门用于操控MMD的文件,包括模型、动作数据等


??现在学一下图形学等学有所得再做出更多东西。

  • 作者:Deeksha Arya等编译:CV君报噵:我爱计算机视觉公众号(id:aicvml) 向大家推荐一篇论文『...

  • 摄像头数据处理 在使用Android设备进行摄像头直播时其过程应该是这样的: 就图像而言,艏先需要获得摄像头采集...

我要回帖

更多关于 enemy legendary 的文章

 

随机推荐