トップページ > 過去ログ > 記事閲覧
3Dモデルの物理演算について
名前:唐須大海 日時: 2011/10/20 18:12

現在、pmdとvmdを組み合わせて、プレイヤーモデルをアニメーションさせようと考えているのですが、 物理演算について2つほど疑問があるので質問させていただきます。 (1)MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_LOADCALC); で読み込む場合  最初のフレームと最終フレームをシームレスに繋げる方法は無いでしょうか?  例えば歩行モーションなどで、髪の毛が物理演算で動いている場合、  始端と終端のポーズが同じであっても髪の毛は慣性で遅延し、  ループの境目で初期位置に瞬間移動してしまいます。  MV1SetAttachAnimBlendRateのような形で、同一番号のアニメーションの始端終端をブレンドする方法はあるのでしょうか? (2)MV1SetLoadModelUsePhysicsMode(DX_LOADMODEL_PHYSICS_REALTIME); で読み込む場合  先の問題より、シームレスなモーションを作るためにリアルタイム物理演算を行おうと考えたのですが、  この場合では、MV1DuplicateModelで作ったモデルに対して物理演算を適用しようとすると  剛体を仕込んだ部位が画面上から消滅し、処理速度も著しく落ちてしまいます。  以下はサンプルの物理アニメーションに、MV1DuplicateModelでコピーしたモデルを加えた物です。  私の環境では、左に映るモデルの表示に異常がありました。 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, CopyModelHandle, AttachIndex ; float TotalTime, PlayTime ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 次に読み込むモデルの物理演算モードをリアルタイム物理演算にする MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_REALTIME ) ; // 3Dモデルの読み込み ModelHandle = MV1LoadModel( "test.pmd" ) ; CopyModelHandle = MV1DuplicateModel( ModelHandle ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // カメラに映る範囲( カメラからの距離の範囲 )を設定 SetCameraNearFar( 10.0f, 1000.0f ) ; // カメラの位置と向きを設定 SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 19.0f, -22.5f ), VGet( 0.0f, 10.0f, 0.0f ) ) ; // 3Dモデルの0番目のアニメーションをアタッチする AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ; MV1AttachAnim( CopyModelHandle, 0, -1, FALSE ) ; //モデル位置のセット MV1SetPosition( ModelHandle, VGet( 10.0f, 0.0f, 0.0f ) ) ; MV1SetPosition( CopyModelHandle, VGet( -10.0f, 0.0f, 0.0f ) ) ; // アタッチしたアニメーションの総再生時間を取得する TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ; // 物理演算の状態をリセット MV1PhysicsResetState( ModelHandle ) ; MV1PhysicsResetState( CopyModelHandle ) ; // 再生時間の初期化 PlayTime = 0.0f ; // 何かキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面をクリア ClearDrawScreen() ; // 再生時間を進める PlayTime += 0.5f ; // 再生時間がアニメーションの総再生時間に達したら再生時間を0に戻す if( PlayTime >= TotalTime ) { PlayTime = 0.0f ; // 再生時間をセットする MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; MV1SetAttachAnimTime( CopyModelHandle, AttachIndex, PlayTime ) ; // モーションがループしたときに位置が移動することがあるので物理演算の状態をリセット MV1PhysicsResetState( ModelHandle ) ; MV1PhysicsResetState( CopyModelHandle ) ; } else { // 再生時間をセットする MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; MV1SetAttachAnimTime( CopyModelHandle, AttachIndex, PlayTime ) ; } // 物理演算を60分の1秒経過したという設定で実行 MV1PhysicsCalculation( ModelHandle, 1000.0f / 60.0f ) ; MV1PhysicsCalculation( CopyModelHandle, 1000.0f / 60.0f ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; MV1DrawModel( CopyModelHandle ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 質問は以上です。 よろしければ回答をお願いいたします。

Page: 1 |

Re: 3Dモデルの物理演算について ( No.1 )
名前:管理人 日時:2011/10/22 19:14

ご質問ありがとうございます クオリティアップ(多分)とバグ修正を行うことができました m(_ _;m > (1)MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_LOADCALC); で読み込む場合 >  最初のフレームと最終フレームをシームレスに繋げる方法は無いでしょうか? >  例えば歩行モーションなどで、髪の毛が物理演算で動いている場合、 >  始端と終端のポーズが同じであっても髪の毛は慣性で遅延し、 >  ループの境目で初期位置に瞬間移動してしまいます。 >  MV1SetAttachAnimBlendRateのような形で、同一番号のアニメーションの始端終端をブレンドする方法はあるのでしょうか? 方法が無かったので処理を追加しました よろしければこちらのバージョンをダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) こちらのバージョンに差し替えた上で、シームレスにループを繋げたいモーションの vmd ファイルのファイル名を  「pmdファイル名(.pmd抜き)」+「モーション番号(000など)」+「.vmd」 という通常の vmd ファイル名のモーション番号のうしろに半角の L を加えて、  「pmdファイル名(.pmd抜き)」+「モーション番号(000など)」+「L」+「.vmd」 という風にしてください 例: test000.vmd → test000L.vmd L が付いているファイルに対してライブラリ内部でループモーションとして通常の事前物理計算とは別の処理を行い、 最終フレームの物理演算の結果と最初のフレームの物理演算の結果を線形補間します( 補間にVMD単位で3フレーム使用します ) 具体的にはループモーション用の事前物理演算は以下のようになっています  モーション再生+物理演算開始   ↓  モーション再生1・2ループ目の物理演算は無視  (「止まった状態からループモーションに移るとき」の物理の動きをループモーションに含めてしまうと不自然に見えるため、   「軌道に乗った」3ループ目まで待つ )   ↓  モーション再生3ループ目の物理演算の結果を採取  最終フレーム手前3フレーム目から3ループ目の最初のフレーム( 0フレーム目 )の物理演算の結果と線形補間 線形補間しているのは物理演算部分だけなので、手元で試した限りではボーンの位置・回転が 最終フレームと最初のフレームで異なっているモーションでは今回の変更を加えても 綺麗には繋がりませんでした なので、モーションの最終フレームと最初のフレームの姿勢はなるべく同じになるようにしてください m(_ _)m > (2)MV1SetLoadModelUsePhysicsMode(DX_LOADMODEL_PHYSICS_REALTIME); で読み込む場合 >  先の問題より、シームレスなモーションを作るためにリアルタイム物理演算を行おうと考えたのですが、 >  この場合では、MV1DuplicateModelで作ったモデルに対して物理演算を適用しようとすると >  剛体を仕込んだ部位が画面上から消滅し、処理速度も著しく落ちてしまいます。 すいません、こちらはただのバグでした (1)の回答にありますバージョンでは修正されていますので、よろしければお試しください m(_ _;m
Re: 3Dモデルの物理演算について ( No.2 )
名前:唐須大海(解決) 日時:2011/10/23 13:41

迅速な対応ありがとうございます。 新機能を確認したところ、最終フレームが綺麗に繋がったリピートアニメの再生が出来ました。 また、リアルタイム物理演算に関しても、コピーが正常に表示される事を確認しました。 このような事細かな要望にまで応えて頂きありがとうございました。
3Dの物理演算について(重力計算に関する追記) ( No.3 )
名前:唐須大海(追記) 日時:2011/10/28 09:51

「解決」としましたが、関連する要望が発生したため、追記とさせていただきます。 現在、MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_LOADCALC); を使ってキャラクターモデルをアニメーションさせているのですが、 キャラクターの運動方向が下向きになる際に重力計算を下向きに行うと、マフラーや頭髪等が下を向き続け、硬い印象を与えてしまいます。 そこで、MV1SetLoadModelPhysicsWorldGravity( float Gravity ) ;の利用を考えたのですが、 こちらはモーション単位ではなくモデル単位での指定となるということで、利用する状況が限られてしまいます。 例えば、同一キャラクターに「ジャンプモーション」と「落下モーション」を仕込もうとすると、同一モデルを二体読み込む必要が出ます。 それではモーションブレンドが難しくなり、シームレス性が損なわれてしまいます。 そこで、先のループアニメの読み込みのように、読み込み時にファイル名に「無重力」や「重力方向反転」といった情報を持たせることは出来ないでしょうか。 例えば「test000LY.vmd」でY軸正方向、「test000LY-.vmd」でY軸負方向、「test000LN.vmd」で無重力計算をする、といったイメージです。 重力方向をXYZ各軸の正負方向と無重力に対応していただければ、(擬似的に)慣性を再現可能になり、 読み込み時物理演算で表現可能となる幅がさらに広がるのでは無いかと思います。 少々限定的で我侭な要望となってしまいますが、御一考いただければ幸いです。
Re: 3Dモデルの物理演算について ( No.4 )
名前:管理人 日時:2011/10/30 21:23

ファイル名に重力関係の情報を付加できるようにしました ループのときは L でしたが、今回は重力なので G にしました 仕様としては 「G」+「軸名( X 又は Y 又は Z )」+「符号 P で+ M で−」 です 例えば上方向に重力を向けたい場合は  test000GYP.vmd X軸のマイナス方向に重力を向けたい場合は  test000GXM.vmd Z軸のプラス方向とY軸のプラス方向( 上方向 )に重力を向けたい場合は  test000GZPYP.vmd 無重力の場合は  test000G.vmd と、ただ G だけを書いてください という感じです XYZはどんな順番で書いても大丈夫です ループ用の L も G の後でも前でも大丈夫です ( ただ、G 記述の途中で L を入れるのはNGです ) これだけで果たしてうまくいくのかちょっと不安ですが、よろしければお試しください (・・; http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip
Re: 3Dモデルの物理演算について ( No.5 )
名前:唐須大海 日時:2011/11/01 14:36

前回に引き続き、迅速な対応恐れ入ります。 動作を確認したところ、ビューワー・プログラムともに各方向に重力方向が変化した事を確認しました。 気になったこととして、Y軸に関しては正負の方向が逆になっているのではないか、と感じました。 ビューワー上で座標軸の伸びている方向を正方向とするのなら、上が正・下が負になる思われますが、 「test000GYPL.vmd」というファイル名では下向き・「test000GYML.vmd」と言うファイル名では上向の重力が発生しました。 なお、他の方向に関しては、座標軸の方向に力が働いているように見えました。 どうか、ご確認のほどをお願いします。
Re: 3Dモデルの物理演算について ( No.6 )
名前:管理人 日時:2011/11/07 00:14

ご報告ありがとうございます 重力のY軸方向が逆になっていたバグを修正しました orz よろしければお試しください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip
Re: 3Dモデルの物理演算について ( No.7 )
名前:唐須大海 日時:2011/11/16 21:08

ご対応ありがとうございます。 ファイル名で指定した座標軸方向に重力が発生している事を確認しました。 しかし、また一つばかり気になることがありましたので報告させていただきます。 vmdファイル名に「G」以降の記述をしない場合のアニメーションに関してですが、 デフォルトの重力が正方向になっているため、重力指定をせずに物理演算を行おうとすると、 上向きの重力が発生して、剛体がめくれ上がってしまいます。 これに関して、特に重力方向の指定がない場合は初期の重力方向は負としておいた方が、 MMDの編集画面と一致したモーションを利用でき、好ましいのではないかと思います。 たびたびの対応に対し、注文ばかりつけるような形になってしまい申し訳ありません……。 どうか、ご確認をお願いします。
Re: 3Dモデルの物理演算について ( No.8 )
名前:管理人 日時:2011/11/20 15:24

ファイル名のG以降の記述が無かった場合は「無重力」の状態になるようになっています ( 手元の環境とモデルで確認はしました ) 可能性は低いですが、もしかしたら唐須さんがお使いのバージョンと今私の手元にあるバージョンで 多少の違いがあるかもしれませんので、よろしければこちらをお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip > たびたびの対応に対し、注文ばかりつけるような形になってしまい申し訳ありません……。 いえ、実用されている方から問題のご報告やご提案を頂けるのはこちらも助かりますので どうぞ気兼ねなくご意見ください m(・・;m

Page: 1 |