残したいユーザーブロマガ記事への投票はこちらです
PMDEプラグインの作り方 ボーン操作編4
プラグインとはいえ普通にC#なので記述の仕方はいろいろありますが、わかりやすくするために記述方法に制限をかけています。必ずこのやり方でないといけないわけではありませんのでご注意ください。
前回と同様にこのサンプルプラグインプロジェクトファイル(http://bowlroll.net/up/dl15339)を元に説明しますので必ずDLしてください。
この中にはボーン操作に必要な機能をあらかじめ入れてあります。説明もそれに沿った形で説明します。また、このプロジェクトファイルの内容を流用してプラグインを作成することは問題ありません。
以下ボーン操作とそのコードを記述します。前回と同様にサンプルプロジェクトファイルにこぴぺすれば動作すると思います。
・腕IKを作ろう。
右腕IK(PMX版)を作成します。
//まず最初に必要な腕ボーンのオブジェクトを取得します
//必要なボーンの取得
IPXBone RightShoulder = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右肩", 1)];
IPXBone RightArm = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右腕", 1)];
IPXBone RightElbow = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右ひじ", 1)];
IPXBone RightWrist = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右手首", 1)];
//次にIKターゲットとなる右手首P
//IKLinkとなる右腕P・右ひじP用にそれぞれの元ボーンをコピーします。
IPXBone RightArmP = (IPXBone)RightArm.Clone();
IPXBone RightElbowP = (IPXBone)RightElbow.Clone();
IPXBone RightWristP = (IPXBone)RightWrist.Clone();
//右腕+の設定
//名前・ボーンの親・ボーンのむきを設定していきます。
RightArmP.Name = "右腕+";
RightArmP.Parent = RightShoulder;
this.SetToBone(RightArmP, RightElbowP);
//右ひじ+の設定
//名前・ボーンの親・ボーンのむきを設定していきます。
RightElbowP.Name = "右ひじ+";
RightElbowP.Parent = RightArmP;
this.SetToBone(RightElbowP, RightWristP);
//右手首+の設定
//名前・ボーンの親・ボーンのむきを設定していきます。
RightWristP.Name = "右手首+";
RightWristP.Parent = RightElbowP;
this.SetToOffset(RightWristP, new V3(0.0f, 1.0f, 0.0f));
//右腕IKボーンの設定
//右腕IKボーンとなるボーンを右手首のコピーとして定義します。
IPXBone RightArmIK = (IPXBone)RightWrist.Clone();
//名前の設定をします。
RightArmIK.Name = "右腕IK";
RightArmIK.Parent = (IPXBone)this.PMX.Bone[0];
//移動・回転可とします
//MMDはIKの場合この値に関係なく操作できますが
//MMMはしっかり設定しないとだめです。
RightArmIK.IsRotation = true;
RightArmIK.IsTranslation = true;
//IKターゲットを設定します。
this.AddIK(RightArmIK, RightWristP);
//IKLinkを設定します。
this.AddIKLink(RightArmIK, RightElbowP);
this.AddIKLink(RightArmIK, RightArmP);
this.SetToOffset(RightArmIK, new V3(0.0f, 1.0f, 0.0f));
//右腕+と右ひじ+の回転を右腕・右ひじに渡すために回転連動の設定 this.SetAppendRotation(RightArm, RightArmP, 1.0f);
this.SetAppendRotation(RightElbow, RightElbowP, 1.0f);
//ボーンを右肩の上に追加していく。
this.UpperInsertBone(RightArmIK, RightShoulder);
this.UpperInsertBone(RightArmP, RightShoulder);
this.UpperInsertBone(RightElbowP, RightShoulder);
this.UpperInsertBone(RightWristP, RightShoulder);
以上で右腕IKを作成できます。
//まず最初に必要な足ボーンのオブジェクトを取得します
//必要なボーンの取得
IPXBone LowerBody = (IPXBone)this.PMX.Bone[this.GetBoneIndex("下半身", 1)]; IPXBone RightLeg = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右足", 1)];
IPXBone RightKnee = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右ひざ", 1)];
IPXBone RightAnkle = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右足首", 1)];
IPXBone RightToe = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右つま先", 1)];
//右足IKボーンの設定
//右足IKボーンとなるボーンを右足首のコピーとして定義します。
IPXBone RightLegIK = (IPXBone)RightAnkle.Clone();
//名前の設定をします。
RightLegIK.Name = "右足IK";
RightLegIK.Parent = (IPXBone)this.PMX.Bone[0];
//移動・回転可とします
//MMDはIKの場合この値に関係なく操作できますが
//MMMはしっかり設定しないとだめです。
RightLegIK.IsRotation = true;
RightLegIK.IsTranslation = true;
//IKターゲットを設定します。
this.AddIK(RightLegIK, RightAnkle);
//IKLinkを設定します。
this.AddIKLink(RightLegIK, RightKnee);
this.AddIKLink(RightLegIK, RightLeg);
this.SetToOffset(RightLegIK, new V3(0.0f, 0.0f, 1.0f));
//ボーンを右足の上に追加していく。
this.UpperInsertBone(RightLegIK, RightLeg);
次は多段の記述に行きます。