ページ 1 / 1
3Dでの床の判定
Posted: 2010年5月19日(水) 17:40
by KOZAN
DXライブラリを使って3Dでキャラクターを動かすプログラムを作っております。
なんとかカメラの位置から移動方向を算出してセットするところまでは出来ました。
ただ床の上にいるようにしたいです。
床は平面だけではなく斜面の部分もあり
それにそってすすむようにしたいのです。
調べてみたのですが法線ベクトルを取得して~?
みたいなことが書いてあったのですがイマイチ理解できませんでした。
どの様にすれば床との当たり判定を取ることが出来るでしょうか?
Re:3Dでの床の判定
Posted: 2010年5月19日(水) 20:29
by ookami
Re:3Dでの床の判定
Posted: 2010年5月19日(水) 20:45
by KOZAN
すみません・・・読んでみたのですが理解できませんでした。
DXライブラリのサイトのサンプルも見てみたのですがこちらもよくわかりません・・・。
Re:3Dでの床の判定
Posted: 2010年5月19日(水) 22:42
by fr
Re:3Dでの床の判定
Posted: 2010年5月19日(水) 23:05
by KOZAN
fr様
ありがとうございます。
2Dの当たり判定なら何度もやったことがあるのでわかるのですが
3Dの場合だと全くの素人なのでこの関数の使い方がわかりません・・・。
お時間取らせてもらって申し訳ないのですが
私のソースをもとにサンプルを頂けないでしょうか?
Re:3Dでの床の判定
Posted: 2010年5月19日(水) 23:50
by ideyan
最初にステージのモデルに対してMV1SetupCollInfoを呼んでコリジョン情報を構築。
キャラクターが移動するときにキャラクターから真下に伸ばした線分と
ステージの当たり判定をMV1CollCheck_Lineで行う。
キャラクターの下方向に何かしらポリゴンがあれば、
判定結果として得られたMV1_COLL_RESULT_POLY型の構造体のHitFlagが1になっているはずです。
このとき、構造体のHitPositionに交差した座標が記録されていますので
それをもとにキャラクターのy座標を調整すればそれっぽくなると思うのですがどうでしょうか?
各関数の使い方はリファレンスとサンプルを見ればなんとなくわかると思います。
Re:3Dでの床の判定
Posted: 2010年5月24日(月) 05:13
by KOZAN
連絡が遅くなってしまい申し訳御座いません。
なんとかそれっぽい動作にすることが出来ました。
但し問題が発生してしまっております。
ゆるい斜面では座標を戻してくれるのですが急斜面(直角ではない)では
反応してくれません。
ソースコードの判定が甘いのかと思うのですが
どこら辺が駄目なのかをご指摘頂けないでしょうか?
又、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 ) ;
Re:3Dでの床の判定
Posted: 2010年5月24日(月) 05:15
by KOZAN
すみません。
過去ログに入ってしまった為一度質問を締めさせて頂きます。
回答して下さった方々
本当にありがとうございました。