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

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

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

2013-03-10 12:06

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

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

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

    前回は簡単な操作の説明をしましたが、実際記述していくと「行いたい操作」と「実行する内容」にかなりの感覚的差異ができます。そこを説明するとかなり面倒なのであらかじめボーン操作に必要な機能を入れたサンプルプロジェクトファイルを作成しました。
    まず最初にサンプルプラグインプロジェクトファイル(http://bowlroll.net/up/dl15339)をDLしてください。
    この中にはボーン操作に必要な機能をあらかじめ入れてあります。説明もそれに沿った形で説明します。また、このプロジェクトファイルの内容を流用してプラグインを作成することは問題ありません。

    1.プロジェクトファイルを開く
    DLしたファイルを
    「ドキュメント」→「Visual Studio 2010」→「Projects」
    に解凍して下さい。(解凍の仕方等については説明しません。)

    画面左上の「ファイル」→「プロジェクトを開く」をクリック


    正常にコピーされていればBoneSampleというフォルダがありますのでそこをクリック


    「BoneSample.sln」というファイルがありますのでそれを開いてください。


    プロジェクトが開きます。



    2.ボーンから取得できる情報
    前回は文字だけの説明でしたのでまずPMDEの画面とボーンオブジェクトから取得できる情報の対応を絵に起こしてみました。

    このような値がボーンオブジェクト(this.PMX.Bone[i]と記述されているもの)から取得することが出来ます。
    この中でローカル軸については操作が特殊ですのでこちらも別途説明します。

    3.3次元表記について
    MMDは3Dソフトですので3次元空間表記とは仲良しにならなければなりません。(まだなれてませんけど!!!w)
    まず、ボーンではPosition/ToOffset/FixAxisについては3次元表記となっています。

    3次元表記は
    V3 Position = new V3(0.0f,0.0f,0.0f);
    この様に定義します。
    この中からそれぞれの値を取り出す時は
    Position.X
    Position.Y
    Position.Z
    このようにして取り出す事が出来ます。

    使用方法としては以下のように使います。
    例)ボーンの場所を変更する。
    IPXBone Bone =(IPXBone)this.PMX.Bone[0];
    Bone.Position = new V3(0.0f,0.0f,0.0f);
    もしくは
    IPXBone Bone =(IPXBone)this.PMX.Bone[0];
    V3 NewPosition = new V3(0.0f,0.0f,0.0f);

    Bone.Position = NewPosition;
    この操作でBoneIndex0のボーンの座標を原点にできます。

    4.実際にボーンを操作してみよう
    ここから実際に操作してみます。
    開いたプロジェクトファイルに
    //-------------------------
    //ここから処理開始
    //-------------------------
    ここにサンプルをコピペする
    //-------------------------
    //処理ここまで
    //-------------------------
    と記述されている部分の間に処理をコピペすると動作するようにサンプルは記述していきます。

    なお、プロジェクトからプラグインの作成方法は前々回説明してありますので割愛します。(http://ch.nicovideo.jp/t0r0/blomaga/ar151387

    ・ボーンIndexを取得しよう
    「頭」ボーンのボーンIndexを取得します。(GetBoneIndexという機能でBoneIndexを取得します。)
    MessageBox.Show(this.GetBoneIndex("頭").ToString());

    ・ボーンの名前を変更しよう
    「頭」ボーンの名称を「頭頭」に変更してみます。(RenameBoneという機能で名称を変更します。)
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    HeadBone.Name="頭頭";

    もしくは

    this.RenameBone("頭","頭頭");

    ・ボーンの位置を変更しよう
    「頭」ボーンの位置を原点に変更してみます。
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    HeadBone.Position=new V3(0.0f,0.0f,0.0f);

    ・ボーンを回転連動にしよう
    「頭」ボーンの動きに首を連動させよう(SetAppendRotationという部分が回転連動に必要な設定を一気に行っています。)
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
    NeckBone.AppendParent = HeadBone;
    NeckBone.AppendRatio = 0.3f;
    NeckBone.IsAppendRotation = true;
    NeckBone.IsAppendTranslation = false;

    もしくは
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    IPXBone NeckBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("首")];
    this.SetAppendRotation(NeckBone, HeadBone, 0.3f);


    ・ボーンをコピーしよう(ボーンの親子関係を調整してないので多段にはなりません。)
    頭ボーンのコピーを作成します。(this.CloneBoneという機能がコピーする際に必要な動作を行っています。)
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    IPXBone CloneHeadBone = (IPXBone)HeadBone.Clone();
    this.PMX.Bone.Add(CloneHeadBone);

    もしくは
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    IPXBone CloneHeadBone = (IPXBone)this.CloneBone(HeadBone);
    this.PMX.Bone.Add(CloneHeadBone);

    ・ボーンを非表示にしよう
    頭ボーンを非表示にします
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    HeadBone.Visible= false;
    HeadBone.Controllable=false;

    ・ボーンに軸制限をかけよう
    頭ボーンをX軸方向にしか動かないようにします。(SetFixAxisの部分が軸制限に必要な操作を行っています。)
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    HeadBone.IsFixAxis = true;
    HeadBone.FixAxis = new V3(1.0f, 0.0f, 0.0f);

    もしくは
    IPXBone HeadBone = (IPXBone)this.PMX.Bone[this.GetBoneIndex("頭")];
    this.SetFixAxis(HeadBone, "GX");

    長いので次に続きます。
    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。