T0R0ブロマガ相关翻译计划(0.4)_PMDE插件的制作方法 骨骼操作篇3
※本文不保证百分之百的翻译准确,仅供参考,具体内容依然以日文原版为准。
原作者T0R0的博客原地址:https://sp.ch.nicovideo.jp/t0r0/blomaga/ar155496
本文内容与暗锅插件并无关系,但也可能能对他人有所帮助,所以也进行翻译。关于对本文翻译内容玩文字游戏、钻空子,从而违反原文使用规约的行为,本人概不负责。
※非原文部分会使用灰色字色。对一些个人认为重要的部分会进行加粗/变色强调。
PMXe相关名词以Emil制作的“多功能信息处理与汉化插件”中的文本为准。
文中图片均为本人依照原博客自作而非搬运,请注意。
对个别词的理解有一定的主观成分,且本文有编程相关专业名词可能会有误译,欢迎评论区理性讨论。
※本篇翻译文章并未获得原作者授权/知悉,仅做交流用途。如有不妥,请评论区留言告知,我会立刻进行删除。
※请勿使用本文章内任何文本/图片做个人参考以外的其他用途,包括但不限于用于汉化文本,二次上传至公共网络等。
○仅限于「PMDE插件的制作方法」系列文章,请自由地取用文章中的代码部分文本(蓝色文本)。对代码中的注释都进行了翻译,虽然并不专业,但希望能为中文使用者提供些许的便利。

原文投稿日期为2013/03/12 16:32

PMDE插件的制作方法 骨骼操作篇3
虽说是插件但也只是普通的C#所以有很多种记载方法,但为了让文章更加易懂,在此为记载方法添加限制。并不是只有这一种写法,请注意。
与上次相同,本文会以此项目示例文件(http://bowlroll.net/up/dl15339)为基础进行说明,所以请务必下载。
在此文件中事先记载了骨骼操作所必需的功能。说明也会按照文件内容的顺序进行。以及,可以使用此项目文件中的内容制作插件。接下来将会记载骨骼操作与对应的代码。与上次相同,应该直接复制粘贴到项目示例文件中就可以使用。
1.来实际操作骨骼试试看吧
・使其成为旋转骨
使頭骨成为旋转骨
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
HeadBone.IsRotation = true;
HeadBone.IsTranslation = false;
・使其成为移动骨
使頭骨成为移动骨
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
HeadBone.IsRotation = false;
HeadBone.IsTranslation = true;
・使其成为旋转移动骨
使頭骨成为旋转移动骨
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
HeadBone.IsRotation = true;
HeadBone.IsTranslation = true;
・使骨骼末端指向设为骨骼。
使頭骨的末端指向设置为首骨(必须将ToOffSet初始化。)
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
HeadBone.ToBone = NeckBone;
HeadBone.ToOffset = new V3(0.0f, 0.0f, 0.0f);
使用项目示例中的功能时则为
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
this.SetToBone(HeadBone, NeckBone);
・使骨骼末端指向设为相对位置。
使頭骨的末端指向设置为相対位置(必须将ToBoneを用null设置为初始化。)
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
HeadBone.ToBone = null;
HeadBone.ToOffset = new V3(1.0f, 0.0f, 0.0f);
使用项目示例中的功能时则为
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
this.SetToOffset(HeadBone,new V3(1.0f,0.0f,0.0f));
・设置Local轴
获取Local轴需要一些比较复杂的计算,所以使用已有功能会比较好。
(SetLocalAxis的部分代码来自うに桑(http://www.nicovideo.jp/user/7939259)。)
一般是这样。
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")]; this.SetLocalAxis(HeadBone);
在MMD中,为了操作的便利性,左肩/左腕/左ひじ/左手首/左手手指的Local轴并非标准方向。为了调整这些Local轴所以需要这个功能。
IPXBone LeftArmBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("左腕")];
this.SetLocalAxis4MMDEx(LeftArmBone);
・生成IK
将頭先设置为IK Target并让頭与首以IK方式运动。
生成IK时IKLink的骨骼添加顺序是有意义的,请注意添加顺序。
//获取作为IK Target的頭先骨
IPXBone HeadPointBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭先")];
//获取頭/首骨
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
//使用頭先的骨骼信息制作IK骨
IPXBone HeadIKBone = (IPXBone)HeadPointBone.Clone();
//IK Target的设置
//代码内的角度是弧度制而PMDE中表示的则是角度制,请注意。
HeadIKBone.IsIK = true;
HeadIKBone.IK.Angle = 1.0f;
HeadIKBone.IK.LoopCount = 20;
HeadIKBone.IK.Target = HeadPointBone;
//IK-Link骨的设置
IPXIKLink HeadIKLink = (IPXIKLink)PEStaticBuilder.Pmx.IKLink();
IPXIKLink NeckIKLink = (IPXIKLink)PEStaticBuilder.Pmx.IKLink();
HeadIKLink.Bone = HeadBone;
NeckIKLink.Bone = NeckBone;
HeadIKBone.IK.Links.Add(NeckIKLink);
HeadIKBone.IK.Links.Add(HeadIKLink);
//添加IK骨 在頭先之前(骨骼顺序)制作IK骨。
this.UpperInsertBone(HeadIKBone, HeadPointBone);
使用项目示例中的功能时则为
//获取作为IK Target的頭先骨
IPXBone HeadPointBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭先")];
//获取頭/首骨
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
//使用頭先的骨骼信息制作IK骨
IPXBone HeadIKBone = (IPXBone)HeadPointBone.Clone();
//IK Target的设置
this.AddIK(HeadIKBone, HeadPointBone);
//IK-Link骨的设置(设置角度限制时则需使用はAddIKLinkLimit。)
this.AddIKLink(HeadIKBone, NeckBone);
this.AddIKLink(HeadIKBone, HeadBone);
//添加IK骨 在頭先之前(骨骼顺序)制作IK骨。
this.UpperInsertBone(HeadIKBone, HeadPointBone);
下次将会记载腕IK/足IK的代码示例。