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

原文投稿日期為2013/03/10?12:06
PMDE插件的制作方法 骨骼操作篇2
雖說是插件但也只是普通的C#所以有很多種記載方法,但為了讓文章更加易懂,在此為記載方法添加限制。并不是只有這一種寫法,請注意。
在前文中進行了簡單操作的說明,不過在實際編寫時「想要進行的操作」與「要運行的內(nèi)容」感覺上會有很大程度的差異。而要解說這種差異是非常麻煩的,所以我事先制作了項目示例文件,總結(jié)了骨骼操作所必需的功能。
首先,請下載項目示例文件(http://bowlroll.net/up/dl15339)(和上一期不一樣記得下載)。
在此文件中事先記載了骨骼操作所必需的功能。說明也會按照文件內(nèi)容的順序進行。以及,可以使用此項目文件中的內(nèi)容制作插件。
1.打開項目文件
(以下將均以目前最新版本的Visual Studio Community 2019進行畫面示范,文章中所有操作也會根據(jù)新版本實際情況進行調(diào)整。)
請將下載后的文件解壓至
「Users」→「(用戶名)」→「source」
文件夾。(在此不說明解壓等操作的方法。)
點擊畫面左上角的「文件」→「打開」→「項目/解決方案」

如果解壓地址正確,應該能看到名為BoneSample的文件夾,點擊打開

能夠看到名為「BoneSample.sln」的文件,請打開此文件。

項目將會打開。

2.能從骨骼中獲取的信息
前文只使用了文字來做解說,所以這次試著將PMDE的畫面與骨骼對象中能獲取的信息一一對應并做成了圖片。

以上的值可以從骨骼對象(記載為this.PMX.Bone[i])中獲取。
這其中Local軸相關(guān)的操作比較特殊,這方面會之后單獨說明。
3.關(guān)于3維表示
因為MMD是3D軟件所以要和3維空間表示打好關(guān)系才行。(雖然我還沒打好關(guān)系?。。。。鳎?br>首先,在骨骼信息中Position/ToOffset/FixAxis需要3維表示。
3維表示是這樣
V3 Position = new V3(0.0f,0.0f,0.0f);
定義的。
從中分別獲取值時可以像這樣
Position.X
Position.Y
Position.Z
獲得。
使用方法如下。
例)改變骨骼的位置。
IPXBone Bone =(IPXBone)this.PMX.Bone[0];
Bone.Position = new V3(0.0f,0.0f,0.0f);
或
IPXBone Bone =(IPXBone)this.PMX.Bone[0];
V3 NewPosition = new V3(0.0f,0.0f,0.0f);
Bone.Position = NewPosition;
這個操作可以使BoneIndex0的骨骼坐標移至原點。
4.實際操作一下骨骼吧
接下來開始實際操作。
將打開的項目文件中
//-------------------------
//處理由此開始
//-------------------------
(在此處粘貼示例)
//-------------------------
//處理到此結(jié)束
//-------------------------
像這樣,為了能讓已經(jīng)寫入的部分之間能夠粘貼所需的處理,示例中記載著上述說明。
由于從項目制作插件的方法在上上回已經(jīng)進行了說明,所以此處不再贅述。(http://ch.nicovideo.jp/t0r0/blomaga/ar151387)
(https://www.bilibili.com/read/cv13892060)
?獲取骨骼Index吧
接下來獲取「頭」骨的骨骼Index。(將使用名為GetBoneIndex的功能來獲取BoneIndex。)
MessageBox.Show(this.GetBoneIndex("頭").ToString());
?改變骨骼名稱吧
試著將「頭」骨的名稱改變?yōu)椤割^頭」。(將使用名為RenameBone的功能來改變骨骼名。)
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
HeadBone.Name="頭頭";
或
this.RenameBone("頭","頭頭");
?改變骨骼的位置吧
試著將「頭」骨的位置改為原點。
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
HeadBone.Position=new V3(0.0f,0.0f,0.0f);
?將骨骼設置為旋轉(zhuǎn)付予吧
讓「頭」骨的動作與首骨連動吧(名為SetAppendRotation的部分將一口氣進行旋轉(zhuǎn)付予所需的設置。)
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
NeckBone.AppendParent = HeadBone;
NeckBone.AppendRatio = 0.3f;
NeckBone.IsAppendRotation = true;
NeckBone.IsAppendTranslation = false;
或
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
this.SetAppendRotation(NeckBone, HeadBone, 0.3f);
?復制骨骼吧(因為沒有調(diào)整骨骼的親子關(guān)系,所以不會成為多段骨。)
將復制頭骨為新骨骼。(名為this.CloneBone的功能將會進行復制骨骼時所必需的操作。)
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone CloneHeadBone = (IPXBone)HeadBone.Clone();
this.PMX.Bone.Add(CloneHeadBone);
或
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
IPXBone CloneHeadBone = (IPXBone)this.CloneBone(HeadBone);
this.PMX.Bone.Add(CloneHeadBone);
?設置骨骼為非顯示吧
將頭骨設置為非顯示骨骼
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
HeadBone.Visible= false;
HeadBone.Controllable=false;
?為骨骼設置軸限制吧
使頭骨只能沿X軸方向旋轉(zhuǎn)。(SetFixAxis的部分將會進行軸限制所必需的操作。)
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
HeadBone.IsFixAxis = true;
HeadBone.FixAxis = new V3(1.0f, 0.0f, 0.0f);
或
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
this.SetFixAxis(HeadBone, "GX");
還會有很多內(nèi)容所以下次繼續(xù)。