ページ 11

DXライブラリ 3D空間での坂道の当たり判定

Posted: 2014年10月04日(土) 00:23
by ptolemy
今回は、3D空間での床の当たり判定について考え方がよくわからないので解説してもらえませんか?
この手の質問は、結構出ていたと思うのですが、坂道の当たったあとの押し上げる処理がよくわかりません。
http://homepage2.nifty.com/natupaji/DxL ... ction.html

上記のURLの解説を参考に壁の当たり判定は、出来たのできました。

一応、僕は人に上下二つの球体をつけて、当たり判定をしています。
どういうことかというと、上半身に球体Aをつけて、足に球体B(半径 A>B)にして、壁に当たったときは、
大きさ的に上半身の球体Aでの壁との当たり判定をしてみました。
床は、高さ的に足にあると壁とは当たらず、床だけと判定できると思い、このような判定方法にしました。

とても大変ですが、坂がある場所ごとに座標で(この区域にプレイヤーが足を踏み入れたらY座標をUP)
とかという方法でもよいと思いますか?

質問が分かりにくいかもしれませんがお願いします。

Re: DXライブラリ 3D空間での坂道の当たり判定

Posted: 2014年10月04日(土) 10:34
by softya(ソフト屋)
3Dにおいての床との処理は奥深いものがあって、物理現象を完全には再現できませんので、これが正解というのはないのです。
なので、それらしく見えれば正解です。

特別複雑でなければ、体の中心からレイを床に飛ばしてレイが当たった所を足元にすれば良いと思いますよ。

Re: DXライブラリ 3D空間での坂道の当たり判定

Posted: 2014年10月04日(土) 14:42
by ptolemy
なるほど。凄く納得しました。

DXライブラリの線分とモデルの判定関数を使って、交差した座標を取得したいと思います。

Re: DXライブラリ 3D空間での坂道の当たり判定

Posted: 2014年10月04日(土) 17:39
by ptolemy
大体ステージのモデルの高さは決まってるので、レイではなく線分でやりました。
また、僕が想像していたような滑らかな縦の斜め移動が出来ました。
ありがとうございました。

一応プログラム載せておきます。

コード:

//一部だけ
    int STAGE ;//ステージのモデルはハンドル
    int Player_X,Player_Y,Player_Z;//プレイヤーの座標
    VECTOR StartPos, EndPos;//線分の始点と終点
    MV1_COLL_RESULT_POLY HitPoly ;

 
    // モデル全体のコリジョン情報を構築
    MV1SetupCollInfo( STAGE,-1,3,3,3 ) ;


    
    while(/*メインループ*/) {
        StartPos = VGet( Player_X, Player_Y+500, Player_Z ) ;//始点
        EndPos   = VGet(  Player_X, Player_Y-10000, Player_Z ) ;
        HitPoly = MV1CollCheck_Line( STAGE , -1, StartPos, EndPos ) ;

   
        if( HitPoly.HitFlag == 1 ){//衝突したら
            Player_Y = HitPoly.HitPosition.y;//この時カメラを相対位置でない場合カメラも座標を移動
        }
    }
こんな感じになりました。
スマホで今書いたのでインデントやスペースがおかしかったら、すみません。
コピペやパソコンで書いた方がよいかもしれませんが事情により、今出来ないので。

今回は、本当にありがとうございました。