3dのキャラクタモデル(.pmd)に
サンプルプログラムの SetModelFramePosition を使い
void SetModelFramePosition( int ModelHandle, char *FrameName, int SetModelHandle )
{
MATRIX FrameMatrix ;
int FrameIndex ;
// フレーム名からフレーム番号を取得する
FrameIndex = MV1SearchFrame( ModelHandle, FrameName ) ;
// フレームの現在のワールドでの状態を示す行列を取得する
FrameMatrix = MV1GetFrameLocalWorldMatrix( ModelHandle, FrameIndex ) ;
// セットするモデルの状態を示す行列をフレームの状態を示す行列と同じにする
MV1SetMatrix( SetModelHandle, FrameMatrix ) ;
}
.mqo形式のアクセサリーモデルを3dのキャラクタモデルのフレームに追従させることはできました。
しかし、ボタン入力を受け、フラグがたつと、追従ではなく、モデルの座標の少し前に表示させたいのですが
うまくいきません。
ボタンを切り替えた時にいた、モデル座標にアクセサリーモデルが残ってしまい、ついてきません。
確認したところ、アクセサリーのモデルは常にモデルの少し前を示しています。
MV1SetPositionの場所も色々変えてみましたがダメでした。
SetModelFramePositionを使った後は何か処理行わないといけないのでしょうか?
3Dモデルの移動
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルの移動
これだけだと良くわかりませんが、常にSetModelFramePositionが呼び出された状態なのではないだろうか?と思うんですがどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
わからんこ
Re: 3Dモデルの移動
つねに呼び出す状態ではないのですが、
色々試しているうちに、気がついたのですが、
描画の順番で変わってくるということはあるのでしょうか?
今はフィールドとモデルを描画する前にアクセサリモデルを描画しています。
今はプログラムをいじれないので憶測なのですがどうでしょうか?
色々試しているうちに、気がついたのですが、
描画の順番で変わってくるということはあるのでしょうか?
今はフィールドとモデルを描画する前にアクセサリモデルを描画しています。
今はプログラムをいじれないので憶測なのですがどうでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルの移動
アクセサリモデルに常にどの様なマトリクスを適用していて、どのようにMV1SetPositionで移動させていているか分からないと答えようが無いですね。
(1)適用している処理
(2)適用している順番
(3)描画のタイミング
です。
解決チェックは外しておきます。
(1)適用している処理
(2)適用している順番
(3)描画のタイミング
です。
解決チェックは外しておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
わからんこ
Re: 3Dモデルの移動
void Accessory_model(void){
if(flag==0){
SetModelFramePosition( mod.ModelHandle, "腰飾り先", mod.Acc_Handle );
}else{
mod.accpos=cam.pos;
mod.accpos=VAdd(mod.accpos,VGet(10.0f,PLAYER_HIT_HEIGHT,10.0f));
MV1SetPosition( mod.Acc_Handle,mod.accpos);
}
}
この関数をメインループのモデルの移動後に呼び出し、次に描写しています。
見てみたところアクセサリーの位置情報は更新されているのですが、移動が行われていない所を
見ると、MV1SetPositionがおかしい気がします。
色々変えてみたのですが、いまだにうまくいきません
if(flag==0){
SetModelFramePosition( mod.ModelHandle, "腰飾り先", mod.Acc_Handle );
}else{
mod.accpos=cam.pos;
mod.accpos=VAdd(mod.accpos,VGet(10.0f,PLAYER_HIT_HEIGHT,10.0f));
MV1SetPosition( mod.Acc_Handle,mod.accpos);
}
}
この関数をメインループのモデルの移動後に呼び出し、次に描写しています。
見てみたところアクセサリーの位置情報は更新されているのですが、移動が行われていない所を
見ると、MV1SetPositionがおかしい気がします。
色々変えてみたのですが、いまだにうまくいきません
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルの移動
ここの注意書きにある問題ではないでしょうか?
「DXライブラリ置き場 3D関係関数リファレンスページ MV1SetMatrix」
http://homepage2.nifty.com/natupaji/DxL ... html#R3N11
引用:この関数に単位行列以外の行列を渡すと、以後 MV1SetPosition や MV1SetScale 等の関数の設定は無視され、 MV1SetMatrix 関数で設定した行列のみを使用してローカル → ワールド座標変換が行われるようになります。 ( 解除する場合は MV1SetMatrix 関数に単位行列を渡します )
注意書きにある通り単位行列を設定してみて下さい。
「DXライブラリ置き場 3D関係関数リファレンスページ MV1SetMatrix」
http://homepage2.nifty.com/natupaji/DxL ... html#R3N11
引用:この関数に単位行列以外の行列を渡すと、以後 MV1SetPosition や MV1SetScale 等の関数の設定は無視され、 MV1SetMatrix 関数で設定した行列のみを使用してローカル → ワールド座標変換が行われるようになります。 ( 解除する場合は MV1SetMatrix 関数に単位行列を渡します )
注意書きにある通り単位行列を設定してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。