DXライブラリを使って3Dでキャラクターを動かすプログラムを作っております。
なんとかカメラの位置から移動方向を算出してセットするところまでは出来ました。
ただ床の上にいるようにしたいです。
床は平面だけではなく斜面の部分もあり
それにそってすすむようにしたいのです。
調べてみたのですが法線ベクトルを取得して~?
みたいなことが書いてあったのですがイマイチ理解できませんでした。
どの様にすれば床との当たり判定を取ることが出来るでしょうか?
3Dでの床の判定
Re:3Dでの床の判定
こんばんは。過去ログから↓を見つけました。参考になりますでしょうか?
http://www.play21.jp/board/formz.cgi?ac ... &rln=51193
http://www.play21.jp/board/formz.cgi?ac ... &rln=51193
Re:3Dでの床の判定
fr様
ありがとうございます。
2Dの当たり判定なら何度もやったことがあるのでわかるのですが
3Dの場合だと全くの素人なのでこの関数の使い方がわかりません・・・。
お時間取らせてもらって申し訳ないのですが
私のソースをもとにサンプルを頂けないでしょうか?
ありがとうございます。
2Dの当たり判定なら何度もやったことがあるのでわかるのですが
3Dの場合だと全くの素人なのでこの関数の使い方がわかりません・・・。
お時間取らせてもらって申し訳ないのですが
私のソースをもとにサンプルを頂けないでしょうか?
Re:3Dでの床の判定
最初にステージのモデルに対してMV1SetupCollInfoを呼んでコリジョン情報を構築。
キャラクターが移動するときにキャラクターから真下に伸ばした線分と
ステージの当たり判定をMV1CollCheck_Lineで行う。
キャラクターの下方向に何かしらポリゴンがあれば、
判定結果として得られたMV1_COLL_RESULT_POLY型の構造体のHitFlagが1になっているはずです。
このとき、構造体のHitPositionに交差した座標が記録されていますので
それをもとにキャラクターのy座標を調整すればそれっぽくなると思うのですがどうでしょうか?
各関数の使い方はリファレンスとサンプルを見ればなんとなくわかると思います。
キャラクターが移動するときにキャラクターから真下に伸ばした線分と
ステージの当たり判定をMV1CollCheck_Lineで行う。
キャラクターの下方向に何かしらポリゴンがあれば、
判定結果として得られたMV1_COLL_RESULT_POLY型の構造体のHitFlagが1になっているはずです。
このとき、構造体のHitPositionに交差した座標が記録されていますので
それをもとにキャラクターのy座標を調整すればそれっぽくなると思うのですがどうでしょうか?
各関数の使い方はリファレンスとサンプルを見ればなんとなくわかると思います。
Re:3Dでの床の判定
連絡が遅くなってしまい申し訳御座いません。
なんとかそれっぽい動作にすることが出来ました。
但し問題が発生してしまっております。
ゆるい斜面では座標を戻してくれるのですが急斜面(直角ではない)では
反応してくれません。
ソースコードの判定が甘いのかと思うのですが
どこら辺が駄目なのかをご指摘頂けないでしょうか?
又、X-FILEを使っております。
自分で作れる環境はあるのですが
あまり高度の物が作れません。
テスト環境で使えるようなサンプルファイルやキャラクターが
置いてありそうな場所はないでしょうか?
なんとかそれっぽい動作にすることが出来ました。
但し問題が発生してしまっております。
ゆるい斜面では座標を戻してくれるのですが急斜面(直角ではない)では
反応してくれません。
ソースコードの判定が甘いのかと思うのですが
どこら辺が駄目なのかをご指摘頂けないでしょうか?
又、X-FILEを使っております。
自分で作れる環境はあるのですが
あまり高度の物が作れません。
テスト環境で使えるようなサンプルファイルやキャラクターが
置いてありそうな場所はないでしょうか?
// マップとの当たり判定 MV1SetupCollInfo( MapModelH, 0, 8, 8, 8 ) ; Player.HitPoly = MV1CollCheck_Line( MapModelH, 0, VGet(Player.Pos.x,Player.Pos.y+2.5f,Player.Pos.z), VGet(Player.Pos.x,Player.Pos.y-2.5f,Player.Pos.z)) ; if( Player.HitPoly.HitFlag == 1 ){ Player.Pos.y = Player.HitPoly.HitPosition.y + 2.0f; Player.Move.y = 0; }else{ Player.Pos.y -= 0.2f; } // 移動量の初期化 Player.Move.x = 0; //Player.Move.y = 0; Player.Move.z = 0; float rot = float(Player.rot/180*M_PI); // 移動処理 if( Key[KEY_INPUT_UP].Flg == 1 ){ Player.Move.x += sin(rot) * Player.MoveSpeed * -1; Player.Move.z += cos(rot) * Player.MoveSpeed * -1; } if( Key[KEY_INPUT_DOWN].Flg == 1 ){ Player.Move.x += sin(rot) * Player.MoveSpeed; Player.Move.z += cos(rot) * Player.MoveSpeed; } // ジャンプ処理 if( Key[KEY_INPUT_SPACE].trgKey == 1 ){ if(Player.Move.y == 0) Player.Move.y = 4; } if(Player.Move.y != 0){ Player.Move.y -= 0.2f; } // 移動値加算 Player.Pos.x += Player.Move.x; Player.Pos.y += Player.Move.y; Player.Pos.z += Player.Move.z; // Yは0より下がらない /* if(Player.Pos.y <= 0){ Player.Pos.y = 0; Player.Move.y = 0; } */ MV1SetPosition( Player.ModelH, Player.Pos ) ;