トップページ > 記事閲覧
物理演算の破綻を検出したい
名前:CYARACON 日時: 2016/01/17 06:48

いつもお世話になっております。 MMDモデルを使用したゲームを制作しているのですが、アクションゲームで動きが大きいためか、 MMDモデルの衣装が物理演算で頻繁に破綻してしまいます。 そこで、もし破綻を検出できれば、物理演算にリセット掛けることで自動的に破綻を防げると考えました。 破綻の検出には、MV1GetMeshMaxPosition を使用してMMDモデルの全メッシュをスキャンし、 そのY座標の最大値と最小値の差でMMDモデルの現在の大きさを調べ、 大きさが異常だったら(物理演算が破綻して衣装が異常に巨大化したら)破綻とみなす・・という方法を考えました。 プログラムを抜粋すると、以下のようになります。 // 最大値/最小値初期化 max_y = -10000.0f ; min_y = 10000.0f ; // モデルに含まれるメッシュの数 hand_num = mmd_handle[mmd_select] ; mesh_num = MV1GetMeshNum( hand_num ) ; // メッシュの数だけループ for( cc1 = 0 ; cc1 < mesh_num ; cc1 ++ ) { // メッシュに含まれる頂点の最大座標値 zahyo_pos = MV1GetMeshMaxPosition( hand_num, cc1 ) ; if ( zahyo_pos.y > max_y ) max_y = zahyo_pos.y ; // メッシュに含まれる頂点の最小座標値 zahyo_pos = MV1GetMeshMinPosition( hand_num, cc1 ) ; if ( zahyo_pos.y < min_y ) min_y = zahyo_pos.y ; } // サイズ判定 mmd_check_data = max_y - min_y ; // この値が極端に大きかったら、破綻とみなす しかしこの方法では、物理演算が破綻して表示されている時でも、 MMDモデルのサイズは異常値になりません。 そこで質問なのですが、 Q1.物理演算が破綻して画面いっぱいに表示されるほど衣装が巨大になっていても、    MV1GetMeshMaxPosition には、巨大化した衣装の座標は反映されないのでしょうか? Q2.物理演算が破綻して衣装が巨大化した時に、その座標を検出できる関数はありませんか? 以上、ご返信いただければ幸いです。
メンテ

Page: 1 |

Re: 物理演算の破綻を検出したい ( No.1 )
名前:管理人 日時:2016/01/17 16:02

> Q1.物理演算が破綻して画面いっぱいに表示されるほど衣装が巨大になっていても、 >    MV1GetMeshMaxPosition には、巨大化した衣装の座標は反映されないのでしょうか? はい、反映されません MV1GetMeshMaxPosition は変形前のローカル座標を取得する関数なので、 取得できる値は物理演算やアニメーションの影響は受けず、常に一定です > Q2.物理演算が破綻して衣装が巨大化した時に、その座標を検出できる関数はありませんか? すみません、ありません 破綻の検出にメッシュの頂点座標を使用されていますが、物理演算による変形はフレーム(ボーン)単位で 行われていますので、MV1GetFramePosition で取得できるフレーム(ボーン)の座標で破綻を判定することができると思います ( MV1GetFramePosition は巨大化した際の座標が反映されますので… )
メンテ
Re: 物理演算の破綻を検出したい ( No.2 )
名前:CYARACON 日時:2016/01/17 23:45

管理人様、素早い回答をいただき、ありがとうございます。 > MV1GetMeshMaxPosition は変形前のローカル座標を取得する関数なので、 >取得できる値は物理演算やアニメーションの影響は受けず、常に一定です なるほど、承知しました。 > MV1GetFramePosition で取得できるフレーム(ボーン)の座標で破綻を判定することができると思います その方法は使えそうですね。あとはこちらで試行錯誤してみます。 ヒントをいただき、ありがとうございます。
メンテ
Re: 物理演算の破綻を検出したい ( No.3 )
名前:CYARACON(解決済み) 日時:2016/01/17 23:53

追記:(解決済み) の記入が抜けてしまいました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存