残したいユーザーブロマガ記事への投票はこちらです
PMDEプラグインの作り方 ボーン操作編3
プラグインとはいえ普通にC#なので記述の仕方はいろいろありますが、わかりやすくするために記述方法に制限をかけています。必ずこのやり方でないといけないわけではありませんのでご注意ください。
前回と同様にこのサンプルプラグインプロジェクトファイル(http://bowlroll.net/up/dl15339)を元に説明しますので必ずDLしてください。
この中にはボーン操作に必要な機能をあらかじめ入れてあります。説明もそれに沿った形で説明します。また、このプロジェクトファイルの内容を流用してプラグインを作成することは問題ありません。
以下ボーン操作とそのコードを記述します。前回と同様にサンプルプロジェクトファイルにこぴぺすれば動作すると思います。
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));
・ローカル軸を設定する
ローカル軸の取得は若干込み入った計算が必要なので機能を利用したほうがいいです。
(SetLocalAxisの部分のコードはうにさん(http://www.nicovideo.jp/user/7939259)にいただきました。)
通常はこちら。
IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")]; this.SetLocalAxis(HeadBone);
MMDの場合操作性のために左肩・左腕・左ひじ・左手首・左各指のLocal軸はスタンダードな向きではありません。 そちらにあわせるのがこの機能です。
IPXBone LeftArmBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("左腕")];
this.SetLocalAxis4MMDEx(LeftArmBone);
・IKの作成
頭先をIKターゲットにし頭と首をIKで動かします。
IKの作成の場合はIKLinkの追加順に意味がありますので気をつけてください。
//ターゲットボーンとして頭先を取得
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ターゲットの設定
//コード内はラジアンで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);
サンプルプロジェクトの機能を利用する場合は
//ターゲットボーンとして頭先を取得
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ターゲットの設定
this.AddIK(HeadIKBone, HeadPointBone);
//IK-Linkボーンの設定(角度制限を行う場合はAddIKLinkLimitを使用します。)
this.AddIKLink(HeadIKBone, NeckBone);
this.AddIKLink(HeadIKBone, HeadBone);
//IKボーンの追加 頭先の一つ上にIKボーンを追加する。
this.UpperInsertBone(HeadIKBone, HeadPointBone);
次は腕IK・足IKのサンプルコードを記述します。