トップページ > 過去ログ > 記事閲覧
3Dアクションの基本について
名前:ぱらりら 日時: 2011/08/06 21:26

( 雑談&質問掲示板からこちらに移させていただきました [管理人] ) 勉強させてもらっていますが、多くの疑問点が生じたので質問してもよろしいでしょうか。 1.void Input_Process( void ) 最初に出てくるこの関数は入力処理を行っていますが、そもそもなんでこんな関数を作る必要があるのでしょうか。 普通にCheckHitKeyを使うだけではダメなのでしょうか。 2.void Player_Process( void ) // ルートフレームのZ軸方向の移動パラメータを無効にする とありますが、これにはどのような意味があるのでしょうか。 これをしなければ後でどのような不都合が生じるのでしょうか。 3.void Player_Move( VECTOR MoveVector ) // 壁ポリゴンと判断された場合でも、プレイヤーのY座標+1.0fより高いポリゴンのみ当たり判定を行う  とありますが、これを行う意味とは何でしょうか。 4.void Player_Move( VECTOR MoveVector ) // ポリゴンの数が列挙できる限界数に達していなかったらポリゴンを配列に追加 とありますが、限界数というのは恣意的に設定できるのですか。これはコンピュータの処理能力に依存するものなのでしょうか。 5.void Player_Move( VECTOR MoveVector ) // プレイヤーの周囲にあるステージポリゴンを取得する ここではキャラよりも大きい球を用いて周囲のステージモデルを検出していますが、 普通にキャラをほぼ覆うカプセルでステージモデルとの当たり判定を出させるだけでは不十分なのでしょうか?

Page: 1 |

Re: 3Dアクションの基本について ( No.1 )
名前:いっち 日時:2011/08/06 21:58

個人的な見解として回答させていただきます。 > 1.void Input_Process( void ) 単に構造化しているだけだと思うので、main関数の中に直接書いても問題ありません。 > 2.void Player_Process( void ) Chara.x の 走るモーションはローカル座標の原点から Z 方向に移動してしまうので、 その場で走らせるための補正だと思います。(ModelViewerでご覧頂けばよくわかると思います) > 3.void Player_Move( VECTOR MoveVector ) キャラのスムーズな移動のためだと思います。(小さな段差を無視するという効果もあります) この処理を行わないと足元のポリゴンが壁と判定されてしまい、崖から落ちなくなります。 使用するモデルのスケールにもよりますが 0.1f ぐらいでも問題ないと思います。 > 4.void Player_Move( VECTOR MoveVector ) 当たり判定を行うポリゴンの数が多ければ多いほど処理に時間がかかりますが、 少なくしすぎると判定が甘くなります。 恣意的というよりは、動作環境や求めるクオリティに合わせて決めるべき値だと思います。 > 5.void Player_Move( VECTOR MoveVector ) MV1CollCheck_Sphere の部分を MV1CollCheck_Capsule に置き換えることは可能だと思います。 ただ、このサンプルでは当たり判定による位置補正を行い、再度当たり判定を行うという流れなので、 最初にざっくりとした範囲のポリゴンのリストを取得して、 その後、キャラぴったりの範囲で当たり判定を行なっているのではないでしょうか。 (このサンプルでは床方面のポリゴンを取りすぎているような気はしますが・・・)
Re: 3Dアクションの基本について ( No.2 )
名前:管理人 日時:2011/08/07 00:43

いっちさんのご回答の方が良い感じですが、 既に書いてしまっていたので私もご回答します >1 ご指摘の通りプログラム実行時の具体的な意味( 効果 )はありません Input_Process を実際に使っているところを見ていただくと分かると思いますが、 処理のまとまり毎に関数を用意してメインループの中では具体的な処理が ScreenFlip 以外使われていません 当然一箇所でしか使わない関数は実処理的には関数化する必要はないので、あくまでメインループに具体的な処理を 沢山書かないために関数化しただけです >2 「// ルートフレームのZ軸方向の移動パラメータを無効にする」の{ }の部分をコメントアウトしてみてください 恐らく意味が分かると思います DxChara.x の歩いたり走ったりするアニメーションにはルートフレーム( フレーム番号 2番 )に Z軸方向に移動するキーが打たれています これをそのままに実際にプログラムでアニメーションを使用してしまうとプログラムで行っている 座標移動に加えてアニメーションに入っている座標移動もされてしまいます なので、この部分でアニメーションに入っている座標移動を無効にしています >3 プレイヤーが崖に向かって進んで行った際に 崖の側面部分の垂直なポリゴンが壁として判定されないように自分が立っている ポリゴンより 1.0f 以上高いポリゴンのみを壁として処理するようにしています >4 はい、 PLAYER_MAX_HITCOLL の define では 2048 となっていますが、この数値を変更することで 限界数を変えることができます 基本的に限界数を超えてポリゴンを配列に加えられない状況になった場合は正常なコリジョン処理が 行えないことを意味しますので、数値はコリジョンモデルに応じて余裕のある値にしておく必要があります >5 プレイヤーサイズ分だけでは壁に衝突して壁から押し出された場合、押し出された後に再度行われる 壁との当たり判定の際に、再度プレイヤーの周囲にあるポリゴンを列挙しなおす必要が発生してしまいます なので、1フレームで移動距離分だけ大き目の範囲にあるポリゴンを調べておいて 壁による押し出し処理が行われた後に改めて周囲にあるポリゴンを調べ直す必要が無いようにしています ただ、サンプルのプログラムは実際のポリゴンとの判定ではプレイヤーサイズのカプセルで行っていますので 1フレームでプレイヤーのサイズ以上に移動してしまうと壁をすり抜けるという現象が発生します ( これを避けるためには「移動距離 ÷ プレイヤーのサイズ」の回数分だけ壁との当たり判定を行う等の対処が必要です )
Re: 3Dアクションの基本について ( No.3 )
名前:ぱらりら(解決) 日時:2011/08/08 08:30

ご回答ありがとうございます。 勉強させていただきました。

Page: 1 |