残したいユーザーブロマガ記事への投票はこちらです
PMDEプラグインの作り方 ボーン操作編5
プラグインとはいえ普通にC#なので記述の仕方はいろいろありますが、わかりやすくするために記述方法に制限をかけています。必ずこのやり方でないといけないわけではありませんのでご注意ください。
前回と同様にこのサンプルプラグインプロジェクトファイル(http://bowlroll.net/up/dl15339)を元に説明しますので必ずDLしてください。
この中にはボーン操作に必要な機能をあらかじめ入れてあります。説明もそれに沿った形で説明します。また、このプロジェクトファイルの内容を流用してプラグインを作成することは問題ありません。
以下ボーン操作とそのコードを記述します。前回と同様にサンプルプロジェクトファイルにこぴぺすれば動作すると思います。
1.多段化してみよう
例として右ひじを多段化してみます。
//右ひじを多段化してみる。
IPXBone BaseBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("右ひじ", 1)];
//多段ボーンを一時的に格納する箱
List<IPXBone> LayerBoneList = new List<IPXBone>();
//多段数
int layer = 3;
for (int i = 0; i < layer; i++)
{
//多段用のボーンを元ボーンからコピー
IPXBone LayerBone = (IPXBone)BaseBone.Clone();
//かぶらないように名前を変更
LayerBone.Name = BaseBone.Name + "_" + i.ToString();
//ボーンを元ボーンの上に追加
this.UpperInsertBone(LayerBone, BaseBone);
//一時格納箱に保存
LayerBoneList.Add(LayerBone);
}
//親ボーンの設定
LayerBoneList[0].Parent = BaseBone.Parent;
for (int j = 1; j < layer; j++)
{
LayerBoneList[j].Parent = LayerBoneList[j - 1];
}
BaseBone.Parent = LayerBoneList[layer - 1];
これで一応右ひじが3段多段化されます。
しかし、各ボーン単位でこれを記述するのは面倒なので
次に多段化の部分を関数にして見ます。
public void CreateLayerBone(IPXBone BaseBone,int layer = 3){
//多段ボーンを一時的に格納する箱
List<IPXBone> LayerBoneList = new List<IPXBone>();
for (int i = 0; i < layer; i++)
{
//多段用のボーンを元ボーンからコピー
IPXBone LayerBone = (IPXBone)BaseBone.Clone();
//かぶらないように名前を変更
LayerBone.Name = BaseBone.Name + "_" + i.ToString();
//ボーンを元ボーンの上に追加
this.UpperInsertBone(LayerBone, BaseBone);
//一時格納箱に保存
LayerBoneList.Add(LayerBone);
}
//親ボーンの設定
LayerBoneList[0].Parent = BaseBone.Parent;
for (int j = 1; j < layer; j++)
{
LayerBoneList[j].Parent = LayerBoneList[j - 1];
}
BaseBone.Parent = LayerBoneList[layer - 1];
}
このような感じで関数化してプロジェクトに追加すれば
以下のように記述にできます。
例)右肩(10段)・右腕(10段)・右ひじ(10段)・右手首(3段)をそれぞれ多段化します。
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)];
this.CreateLayerBone(RightShoulder,10);
this.CreateLayerBone(RightArm,10);
this.CreateLayerBone(RightElbow,10);
this.CreateLayerBone(RightWrist,3);
このようにして処理単位でまとめておけばあとで便利です。
次はボーン表示枠について記述していきます。