「ユーザーブロマガ」サービスの終了(10月7日を予定)にあたり、残したいユーザーブロマガ記事への投票を受け付けています

PMDEプラグインの作り方 ボーン操作編6
閉じる
閉じる

PMDEプラグインの作り方 ボーン操作編6

2013-03-13 20:48
  • 2

残したいユーザーブロマガ記事への投票はこちらです

PMDEプラグインの作り方 ボーン操作編6

プラグインとはいえ普通にC#なので記述の仕方はいろいろありますが、わかりやすくするために記述方法に制限をかけています。必ずこのやり方でないといけないわけではありませんのでご注意ください。

前回と同様にこのサンプルプラグインプロジェクトファイル(http://bowlroll.net/up/dl15339)を元に説明しますので必ずDLしてください。
この中にはボーン操作に必要な機能をあらかじめ入れてあります。説明もそれに沿った形で説明します。また、このプロジェクトファイルの内容を流用してプラグインを作成することは問題ありません。
以下ボーン操作とそのコードを記述します。前回と同様にサンプルプロジェクトファイルにこぴぺすれば動作すると思います。


1.表示枠のIndexを取得します。
//ボーン表示枠の名前
string BoneFrameName="その他";
//表示枠Index
int Index=-1;
//表示枠を順番にチェックします。
for (int i = 0; i < this.PMX.Node.Count; i++)
{
//表示枠の名前が同じものがあればIndexにiを代入します。

if (this.PMX.Node[i].Name == BoneFrameName)
{
Index = i;
}

}

こちらもボーン同様にGetFramIndexという関数にしてあります。

2.表示枠内の要素Indexを取得する。
//ボーン表示枠の名前
string BoneFrameName="その他";
//ボーン表示枠から取得したいボーンの名前
string BoneName="前髪1";
//表示枠内Index
int Index=-1;
//表示枠Indexを取得します

int i = this.GetFrameIndex(BoneFrameName);
if (i >= 0)
{
//表示枠を取得します。

IPXNode node = (IPXNode)this.PMX.Node[i];
//ボーンIndexを取得します。

int j = this.GetBoneIndex(BoneName);
if (j >= 0)
{
IPXBone Bone = (IPXBone)this.PMX.Bone[j];
//表示枠内のアイテムを順番にチェックします。

for (int k = 0; k < node.Items.Count; k++)
{
//表示枠内のアイテムと比較して同じだったらIndexにiの値を代入します。

if (node.Items[i].BoneItem.Bone == Bone)
{
Index= k;
}
}
}

こちらもボーン同様にGetBoneFrameItemIndexという関数にしてあります。


3.ボーン表示枠を作成します。
例)「その他」というボーン表示枠を追加します。

//ボーン表示枠の名前
string BoneFrameName="その他";
//ボーン表示枠の空箱作成
IPXNode node=PEStaticBuilder.Pmx.Node();
//空枠に名前をつける
node.Name=BoneFrameName;
//表示枠に追加する。
this.PMX.Node.Add(node);

もしくは

//テンプレートプロジェクトを使う場合
//ボーン表示枠の名前
string BoneFrameName="その他";
//表示枠に追加する。
this.AddBoneFrame(BoneFrameName);

以上でボーン表示枠に新しい表示枠を追加できます。

4.ボーン表示枠にボーンを追加します。
例)「その他」というボーン表示枠に「前髪1」ボーンを追加します。

//ボーン表示枠の名前
string BoneFrameName="その他";
//ボーン表示枠に追加したいボーンの名前
string BoneName="前髪1";
//ボーン表示枠のIndexを取得
int i=this.GetFrameIndex(BoneFrameName,1);
//ボーンのIndexを取得
int j=this.GetBoneIndex(BoneName,1);
//表示枠を取得
IPXNode node=(IPXNode)this.PMX.Node[i];
//表示枠の中の空箱を作成
IPXBoneNodeItem NodeItem=PEStaticBuilder.Pmx.BoneNodeItem();
//空箱の中にボーンを入れる。
NodeItem.Bone=this.PMX.Bone[j];
//表示枠の中に追加
node.Items.Add(NodeItem);

もしくは

//テンプレートプロジェクトを使う場合
//ボーン表示枠の名前
string BoneFrameName="その他";
//ボーン表示枠に追加したいボーンの名前
string BoneName="前髪1";
//ボーン表示枠にボーンを追加する。
this.AddBoneFrameItem(BoneFrameName,BoneName);

5.ボーン表示枠の中のボーンを削除します。
//ボーン表示枠の名前
string BoneFrameName = "その他";
//ボーン表示枠から削除したいボーンの名前
string BoneName = "前髪1";
//表示枠を取得
int j=this.GetFrameIndex(BoneFrameName;
IPXNode BoneFrame = (IPXNode)this.PMX.Node[j)];
int k=this.GetBoneIndex(BoneName);
IPXBone Bone = (IPXBone)this.PMX.Bone[k];
//ボーン表示枠の中から
for (int i=0;i<BoneFrame.Items.Count;i++){
if(BoneFrame.Items[i].isBone)
{
if (BoneFrame.Items[i].BoneItem.Bone == Bone)
{
BoneFrame.Items.Remove(BoneFrame.Items[i]);
}
}
}

もしくは

//テンプレートプロジェクトを使う場合
//ボーン表示枠の名前
string BoneFrameName = "その他";
//ボーン表示枠から削除したいボーンの名前
string BoneName = "前髪1";
//表示枠を取得
int i=this.GetFrameIndex(BoneFrameName);
IPXNode BoneFrame = (IPXNode)this.PMX.Node[i];
int j=this.GetBoneFrameItemIndex(BoneFrameName, BoneName);
BoneFrame.Items.Remove(BoneFrame.Items[j]);

6.ボーン表示枠を削除します。
//ボーン表示枠の名前
string BoneFrameName = "その他";
//表示枠を取得
int i=this.GetFrameIndex(BoneFrameName);
IPXNode BoneFrame = (IPXNode)this.PMX.Node[i];
//表示枠の中身をクリアします。
BoneFrame.Items.Clear();
//表示枠を削除します。
this.PMX.Node.Remove(BoneFrame);

7.ボーン表示枠のどこかに入っているボーンを表示枠から削除します。
//ボーン表示枠から削除したいボーンの名前
string BoneName = "前髪1";
//ボーンを取得します。
IPXBone Bone = (IPXBone)this.PMX.Bone[this.GetBoneIndex(BoneName)];
for (int i=0;i<this.PMX.Node.Count;i++)
{
IPXNode Node = (IPXNode)this.PMX.Node[i];
for (int j = 0; j < Node.Items.Count; j++)
{
if (Node.Items[j].IsBone)
{ if (Node.Items[j].BoneItem.Bone == Bone)
{
Node.Items.Remove(Node.Items[j]);
}
}
}
}


以上でボーンに関する基本的な操作は網羅してあると思います。

後はC#の本を買うなりぐぐるなりしてくださいw

次はモーフに関して記述していきます。


広告
×
はじめまして。chiryと申します。
いつもT0R0様の講座を参考にさせていただいております。
この度、T0R0様のライブラリを使用させていただいておりましたところ、
GetBoneFrameItemIndex関数の返り値がreturn kとなるべき部分が、return iとなっておりましたので報告させて頂きます。
100ヶ月前
×
了解です。直してアップしなおしておきますw
あ、あと作成されているプラグインのnamespaceの名称が元のBoneSampleのままなので何か適当な名前に変更した方がいいので確認ねがいます。
100ヶ月前
コメントを書く
コメントをするには、
ログインして下さい。