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

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

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

2013-03-09 23:31
  • 7

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

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

プラグインとはいえ普通にC#なので記述の仕方はいろいろありますが、わかりやすくするために記述方法に制限をかけています。必ずこのやり方でないといけないわけではありませんのでご注意ください。
まず最初にサンプルプラグインプロジェクトファイル(http://bowlroll.net/up/dl15315)をDLしてください。
ここ(BoneSample.cs)に最低限必要な記述を書いてあります。

その内容を説明します。

1.PMDEditerを操作するために必要な変数の宣言
BoneSample.csの中に以下のような記述があります。ここはPMDEditerがもっているモデル情報や画面情報を取り出すための入れ物の定義をしています。
/// <summary>
/// PMDEditerを操作するために必要な変数群
/// </summary>
//-----------------------------------------------------------
public IPEPluginHost host;
public IPEBuilder builder;
public IPEShortBuilder bd;
public IPEConnector connect;
public IPEXPmd pex;
public IPXPmx PMX;
public IPEPmd PMD;
public IPEFormConnector Form;
public IPXPmxViewConnector PMXView;
public IPEPMDViewConnector PMDView;
//-----------------------------------------------------------

2.定義した変数に実際の値を格納します。
//-----------------------------------------------------------
//PMD/PMXファイルを操作するためにおまじない。
this.host = args.Host;
this.builder = this.host.Builder;
this.bd = this.host.Builder.SC;
this.connect = this.host.Connector;
this.pex = this.connect.Pmd.GetCurrentStateEx();
this.PMD = this.connect.Pmd.GetCurrentState();
this.PMX = this.connect.Pmx.GetCurrentState();
this.Form = this.connect.Form;
this.PMDView = this.connect.View.PMDView;
//-----------------------------------------------------------
この部分が定義した変数に実際の値を格納しています。
この値の中からボーン情報等を取得してきます。

3.ボーン情報の取得
サンプル内の上の部分がボーン情報の取得サンプルとなります。
//-----------------------------------------------------------
//ボーン情報の取得
//(通常ボーンIndex0はセンターなのでセンターの真下のボーン情報を取得)
//ウィンドウに文字列を表示します:MessageBox.Show
//文字列の結合は「+」で表記します。
//改行の意味:System.Environment.NewLine
//値を文字列に変換します:ToString()
//-----------------------------------------------------------
//以下の様な形でボーンの情報が取得できます。
文字列「ret」の中にボーン名・ボーン位置・親ボーンの名前を取得してウィンドウに表示しています。

string ret = "";

ret += "ボーン名:" + this.PMX.Bone[1].Name + System.Environment.NewLine;

ret += "ボーン英語名:" + this.PMX.Bone[1].NameE + System.Environment.NewLine;

ret += "ボーン位置:" + "("
+ this.PMX.Bone[1].Position.X.ToString() + ","
+ this.PMX.Bone[1].Position.Y.ToString() + ","
+ this.PMX.Bone[1].Position.Z.ToString() + ")" + System.Environment.NewLine;

ret += "親ボーン:" + this.PMX.Bone[1].Parent.Name + System.Environment.NewLine;
//ウィンドウに文字列「ret」を表示します。
MessageBox.Show(ret);
//-----------------------------------------------------------

4.ボーンIndexの取得
PMDEditer内ではボーン・モーフ・頂点に番号がついており、またその番号に意味があるためこれを取得する操作が基本になります。
//-----------------------------------------------------------
//ボーンIndex番号の取得
//ボーン数:this.PMX.Bone.Count
//-----------------------------------------------------------
//頭という名称のボーンを探してそのボーンIndexを取得する。
for (int i = 0; i < this.PMX.Bone.Count; i++)
{
if (this.PMX.Bone[i].Name == "頭")
{
MessageBox.Show("ボーンIndex:" + i.ToString());
}
}

この操作はボーンIndex0からボーン数までボーンの名前が「頭」のものを探して最初に見つかったIndex番号をウィンドウに表示します。
この操作はよく使うので以下のような関数にしておくと便利です。

/// <summary>
/// ボーンIndexを返す関数です。
/// </summary>
/// <param name="BoneName">ボーン名</param>
/// <returns>ボーンIndex</returns>
public int GetBoneIndex(string BoneName)
{
for (int i = 0; i < this.PMX.Bone.Count; i++)
{
if (this.PMX.Bone[i].Name == BoneName)
{
return i;
}
}
return -1;
}

5.ボーンの追加方法
以下の手続きでボーンを追加します。
//-----------------------------------------------------------
//ボーンの追加方法
//-----------------------------------------------------------
//ボーンオブジェクトを生成
IPXBone AddBone = (IPXBone)PEStaticBuilder.Pmx.Bone();
//ボーンの情報を設定
AddBone.Name = "追加ボーン";
AddBone.Position = new V3(0.0f, 1.0f, 0.0f);
AddBone.Parent = (IPXBone)this.PMX.Bone[0];
//ボーン追加
//単純に追加する場合はこちら
this.PMX.Bone.Add(AddBone);
//あるボーンIndex(BoneIndex)の上にAddBoneを追加したい場合はこちら
this.PMX.Bone.Insert(BoneIndex,AddBone)
//PMXファイルを更新します。
this.connect.Pmx.Update(this.PMX);
//-----------------------------------------------------------

6.ボーン削除方法
以下の手続きでボーンを削除します。
//-----------------------------------------------------------
//ボーンの削除方法(ボーンIndex0のボーン(DelBone)を削除します。)
//-----------------------------------------------------------
IPXBone DelBone = (IPXBone)this.PMX.Bone[0];
this.PMX.Bone.Remove(DelBone);
//PMXファイルを更新します。
this.connect.Pmx.Update(this.PMX);
//-----------------------------------------------------------

ボーン操作編2に続く・・・。


広告
×
はじめまして、プログラム初心者です(4日目くらい)
簡単なプラグインを作りたくて読ませていただいたんですが
モデル情報と材質の取得方法を教えてください。
自分なりにトライしたんですがチンプンカンプンなもので、
それとそれをtxtファイルにする場合の注意事項があればお願いします。
102ヶ月前
×
モデル情報でしたら
IPXModelInfo info = pmx.ModelInfo;
string Name = info.ModelName;
string Cmment=info.Comment;
で取得できます。

材質については目的がわからないのでなんともいえませんが
一通りの機能はこのサンプルプロジェクト(http://bowlroll.net/up/dl16315)に入っています。
102ヶ月前
×
テキストファイルとしての出力方法は
オブジェクトから「string型」の情報を取得して
・C#プログラミングTips(ファイル入出力の基礎)
http://www.atmarkit.co.jp/fdotnet/csharptips/005file/005file.html
・.NET TIPS(ファイルにテキストを書き込むには?)
http://www.atmarkit.co.jp/fdotnet/dotnettips/667filewrite/filewrite.html
上記URLを参考にどうぞ。
102ヶ月前
×
お忙しいところ早速ありがとうございます。
モデル情報取得助かります
材質の情報取得は名前だけは取得できたんですが、それ以外が?同じように
Diff = "Diffuse:" + "(" + this.PMX.Material[0].Diffuse.ToString() + "," + System.Environment.NewLine;
とすると SlimDX 変換?が必要 V4・・・・・?今現在

なんのプラグインを作りたいかといいますと、mqdl氏作成のMetasequoiaプラグインkeynote/ExportPMD用の設定テキストファイルを作れるPMXEditorプラグインです。

C#検索すれば検索するほど深みにハマりこちらのグロマガで希望がみえました
もうちょっと頑張ってみます
102ヶ月前
×
IPXMaterial.DiffuseはVector4なので
this.PMX.Material[0].Diffuse.R.String();
this.PMX.Material[0].Diffuse.G.String();
this.PMX.Material[0].Diffuse.B.String();
this.PMX.Material[0].Diffuse.A.String();
で取れると思います。
102ヶ月前
×
取れました。小文字いれて悩んでおりました
102ヶ月前
×
これは、C#なんですね。
C++でもできるのかな?
環境つくれたら、やってみようと思います。
93ヶ月前
コメントを書く
コメントをするには、
ログインして下さい。