T0R0ブロマガ相關翻譯計劃(0.4)_PMDE插件的制作方法 骨骼操作篇3
※本文不保證百分之百的翻譯準確,僅供參考,具體內(nèi)容依然以日文原版為準。
原作者T0R0的博客原地址:https://sp.ch.nicovideo.jp/t0r0/blomaga/ar155496
本文內(nèi)容與暗鍋插件并無關系,但也可能能對他人有所幫助,所以也進行翻譯。關于對本文翻譯內(nèi)容玩文字游戲、鉆空子,從而違反原文使用規(guī)約的行為,本人概不負責。
※非原文部分會使用灰色字色。對一些個人認為重要的部分會進行加粗/變色強調。
PMXe相關名詞以Emil制作的“多功能信息處理與漢化插件”中的文本為準。
文中圖片均為本人依照原博客自作而非搬運,請注意。
對個別詞的理解有一定的主觀成分,且本文有編程相關專業(yè)名詞可能會有誤譯,歡迎評論區(qū)理性討論。
※本篇翻譯文章并未獲得原作者授權/知悉,僅做交流用途。如有不妥,請評論區(qū)留言告知,我會立刻進行刪除。
※請勿使用本文章內(nèi)任何文本/圖片做個人參考以外的其他用途,包括但不限于用于漢化文本,二次上傳至公共網(wǎng)絡等。
○僅限于「PMDE插件的制作方法」系列文章,請自由地取用文章中的代碼部分文本(藍色文本)。對代碼中的注釋都進行了翻譯,雖然并不專業(yè),但希望能為中文使用者提供些許的便利。

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

PMDE插件的制作方法 骨骼操作篇3
雖說是插件但也只是普通的C#所以有很多種記載方法,但為了讓文章更加易懂,在此為記載方法添加限制。并不是只有這一種寫法,請注意。
與上次相同,本文會以此項目示例文件(http://bowlroll.net/up/dl15339)為基礎進行說明,所以請務必下載。
在此文件中事先記載了骨骼操作所必需的功能。說明也會按照文件內(nèi)容的順序進行。以及,可以使用此項目文件中的內(nèi)容制作插件。接下來將會記載骨骼操作與對應的代碼。與上次相同,應該直接復制粘貼到項目示例文件中就可以使用。
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的設置
//代碼內(nèi)的角度是弧度制而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的代碼示例。