トップページ > 過去ログ > 記事閲覧
3Dモデル回転後の物理演算リセット
名前:みょも 日時: 2012/12/13 20:21

リアルタイム物理演算に限らず、DX_LOADMODEL_PHYSICS_LOADCALCでも発生しますが、 とりあえず物理演算リセットのできるリアルタイム演算を前提にお話します。 PMDモデルにVMDモーションを読み込ませていて、ちょくちょくモーションの始めから スカート類がすごいことになってしまう現象が起きています。 同時に髪が地面に落ち込んだりとかもあったのですが、そちらはMV1PhysicsResetState を使うと改善していましが、 スカートは MV1PhysicsCalculation を数百回回したりしてみても改善されません。 多くのモデルで差違はあっても起こるのですが、こちらのモデルでは特に発生しやすく、 モーション再生中に直るということも殆どみられません。 ttp://bowlroll.net/up/dl3934 モーションを使わずに試行錯誤していたところ、MV1SetPositionでは大きく位置移動してもリセットがうまく機能するのですが、 MV1SetRotationXYZでY軸180度(3.14f)等大きく回転を行うとスカートがおかしくなるというのが分かりました。 こちらでも髪が落ちる等の現象は発生してもうまくリセットできます。 スカートの場合は体に埋もれて安定してしまい、出てこない感じでしょうか。 リセットでスカートもその時点のボーン位置に戻せればいいんですが・・・ MMDの方でも実は同じ現象はおきるのですが、モーション再生→適当に停止、を一回やると うまくリセットされているのか、以後は発生しないようです。 リセットのできないロード時演算だとこの辺り解消のしようもなさそうなので、素人考えですが 直立状態からでなく、モーションの最初のフレームを物理計算の基点にすることが選択できるとよさそうな気もします。

Page: 1 |

Re: 3Dモデル回転後の物理演算リセット ( No.1 )
名前:管理人 日時:2012/12/16 14:37

物理演算のリセット処理でモデルの状態を考慮していない箇所が一部ありました ( 一部なので、今までも一応姿勢は考慮した処理になっています ) その部分を修正したところ教えて頂いた方法で再現できるスカートのめり込み現象なども 解消されましたので、よろしければお試しになってみてください 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/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip
Re: 3Dモデル回転後の物理演算リセット ( No.2 )
名前:みょも 日時:2012/12/16 21:58

修正ありがとうございます。 具合は変わったような気もしますが・・・やはり埋もれてしまうようです。 前述のモデルを使用し、VC++で次のようなコードを試しました。 ------------------------------- // 後ろを向かせる MV1SetRotationXYZ(model, VGet(0.0f, 3.14f, 0.0f)); // 物理演算リセット MV1PhysicsResetState(model); // ループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // バックバッファに描画 SetDrawScreen(DX_SCREEN_BACK); // カメラの 手前クリップ距離と 奥クリップ距離を設定する SetCameraNearFar(1.0f, 2000.0f); // カメラの位置を設定 (後ろを向いているモデルの正面側から) SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 10.0f, 20.0f), VGet(0.0f, 10.0f, 0.0f)); // 画面を初期化する ClearDrawScreen() ; // モデル描画 MV1DrawModel(model); // 裏画面の内容を表画面に反映させる ScreenFlip() ; // 物理演算の時間経過 MV1PhysicsCalculation(model, 33.333f); } ------------------------------- MV1PhysicsResetStateを使わないよりは良い状態には違いないのですが・・・ ResetStateの使い方やタイミングがよくないんでしょうか。 DXライブラリのヘッダファイルを覗くとVerは3.09aのままですが、 タイムスタンプは以前ダウンロードした11/27から12/16に変わっているので ライブラリが更新できていないということはなさそうです。 リビルドしたVC++同様、C#でも違いはありませんでした。
Re: 3Dモデル回転後の物理演算リセット ( No.3 )
名前:管理人 日時:2012/12/31 02:13

モーションを流しながらだと問題が発生しなかったので、直ったと思ってしまいました 載せて頂いたコードで再度現象を確認して、今度こそ修正できたと思いますので よろしければお試しになってみてください 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/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip
Re: 3Dモデル回転後の物理演算リセット ( No.4 )
名前:みょも(解決済み) 日時:2012/12/31 08:13

確かに問題解決しました。 年の瀬の大変忙しい時期に対応ありがとうございました。 どうぞ良いお年をお迎え下さい。

Page: 1 |