3Dでの床の判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KOZAN

3Dでの床の判定

#1

投稿記事 by KOZAN » 15年前

DXライブラリを使って3Dでキャラクターを動かすプログラムを作っております。
なんとかカメラの位置から移動方向を算出してセットするところまでは出来ました。

ただ床の上にいるようにしたいです。
床は平面だけではなく斜面の部分もあり
それにそってすすむようにしたいのです。

調べてみたのですが法線ベクトルを取得して~?
みたいなことが書いてあったのですがイマイチ理解できませんでした。

どの様にすれば床との当たり判定を取ることが出来るでしょうか?

ookami

Re:3Dでの床の判定

#2

投稿記事 by ookami » 15年前

こんばんは。過去ログから↓を見つけました。参考になりますでしょうか?
http://www.play21.jp/board/formz.cgi?ac ... &rln=51193

KOZAN

Re:3Dでの床の判定

#3

投稿記事 by KOZAN » 15年前

すみません・・・読んでみたのですが理解できませんでした。
DXライブラリのサイトのサンプルも見てみたのですがこちらもよくわかりません・・・。

fr

Re:3Dでの床の判定

#4

投稿記事 by fr » 15年前

少し調べてみました。
これでいけるのではないでしょうか。
http://homepage2.nifty.com/natupaji/DxL ... .html#R9N4

KOZAN

Re:3Dでの床の判定

#5

投稿記事 by KOZAN » 15年前

fr様
ありがとうございます。
2Dの当たり判定なら何度もやったことがあるのでわかるのですが
3Dの場合だと全くの素人なのでこの関数の使い方がわかりません・・・。

お時間取らせてもらって申し訳ないのですが
私のソースをもとにサンプルを頂けないでしょうか?

ideyan

Re:3Dでの床の判定

#6

投稿記事 by ideyan » 15年前

最初にステージのモデルに対してMV1SetupCollInfoを呼んでコリジョン情報を構築。

キャラクターが移動するときにキャラクターから真下に伸ばした線分と
ステージの当たり判定をMV1CollCheck_Lineで行う。

キャラクターの下方向に何かしらポリゴンがあれば、
判定結果として得られたMV1_COLL_RESULT_POLY型の構造体のHitFlagが1になっているはずです。

このとき、構造体のHitPositionに交差した座標が記録されていますので
それをもとにキャラクターのy座標を調整すればそれっぽくなると思うのですがどうでしょうか?

各関数の使い方はリファレンスとサンプルを見ればなんとなくわかると思います。

KOZAN

Re:3Dでの床の判定

#7

投稿記事 by KOZAN » 15年前

連絡が遅くなってしまい申し訳御座いません。
なんとかそれっぽい動作にすることが出来ました。
但し問題が発生してしまっております。
ゆるい斜面では座標を戻してくれるのですが急斜面(直角ではない)では
反応してくれません。
ソースコードの判定が甘いのかと思うのですが
どこら辺が駄目なのかをご指摘頂けないでしょうか?

又、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 ) ;

KOZAN

Re:3Dでの床の判定

#8

投稿記事 by KOZAN » 15年前

すみません。
過去ログに入ってしまった為一度質問を締めさせて頂きます。

回答して下さった方々
本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る