トップページ > 記事閲覧
モデルのてっぺん付近の当たり判定が取れない?
名前:名無三 日時: 2021/02/02 00:02

前回に続きマイクラ風の描画をしており、今床判定を作っています。その際にモデルの天辺に真上から真下にMV1CollCheck_Lineしても 当たっていそうなのにHitFlag=FALSEが返ってきます… github.com/yabushita0312/mcraft.git map.hppの114~117行目のblockをblock_badにすると同ファイルのgetcol_line_floor関数において床判定ができずすり抜けます blockとblock_badとの差は底辺のメッシュの有無で、床判定では天辺との判定が欲しいのですが天辺をすり抜けて底面を床として認識する ようになってしまっているようです 確認をお願いします。
メンテ

Page: 1 |

Re: モデルのてっぺん付近の当たり判定が取れない? ( No.1 )
名前:管理人 日時:2021/02/02 22:25

すみません、アップしていただいたプログラムをビルドしようとしたのですが、 以下のようなエラーが発生してビルドができませんでした 1>mcraft\tankflanker\tankflanker\route.hpp(11): error C3646: 'camera_main': 不明なオーバーライド指定子です 1>mcraft\tankflanker\tankflanker\route.hpp(11): error C2059: 構文エラー: ',' 1>mcraft\tankflanker\tankflanker\route.hpp(11): error C2238: ';' の前に無効なトークンがあります。 1>mcraft\tankflanker\tankflanker\route.hpp(45): error C2065: 'HostPassEffect': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(45): error C2672: 'std::make_unique': 一致するオーバーロードされた関数が見つかりませんでした。 1>mcraft\tankflanker\tankflanker\route.hpp(45): error C2974: 'std::make_unique': テンプレート 引数が '_Ty' に対して無効です。型が必要です 1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\memory(2553): note: 'std::make_unique' の宣言を確認してください 1>mcraft\tankflanker\tankflanker\route.hpp(47): error C2065: 'HostPassEffect': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(47): error C2672: 'std::make_unique': 一致するオーバーロードされた関数が見つかりませんでした。 1>mcraft\tankflanker\tankflanker\route.hpp(47): error C2974: 'std::make_unique': テンプレート 引数が '_Ty' に対して無効です。型が必要です 1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\memory(2553): note: 'std::make_unique' の宣言を確認してください 1>mcraft\tankflanker\tankflanker\route.hpp(115): error C2065: 'camera_main': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(117): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(118): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(211): error C2039: 'push': 'switchs' のメンバーではありません。 1>dxlib_vc\dx_vc\dxlib_ref\dxlib_ref.h(792): note: 'switchs' の宣言を確認してください 1>mcraft\tankflanker\tankflanker\route.hpp(213): error C2039: 'Update_far_Shadow': 'DXDraw' のメンバーではありません。 1>dxlib_vc\dx_vc\dxlib_ref\dxlib_ref.h(200): note: 'DXDraw' の宣言を確認してください 1>mcraft\tankflanker\tankflanker\route.hpp(216): error C2039: 'push': 'switchs' のメンバーではありません。 1>dxlib_vc\dx_vc\dxlib_ref\dxlib_ref.h(792): note: 'switchs' の宣言を確認してください 1>mcraft\tankflanker\tankflanker\route.hpp(218): error C2039: 'Update_far_Shadow': 'DXDraw' のメンバーではありません。 1>dxlib_vc\dx_vc\dxlib_ref\dxlib_ref.h(200): note: 'DXDraw' の宣言を確認してください 1>mcraft\tankflanker\tankflanker\route.hpp(224): error C2065: 'camera_main': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(226): error C2065: 'camera_main': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(226): error C2660: 'DxLib::Set3DSoundListenerPosAndFrontPosAndUpVec': 関数に 1 個の引数を指定できません。 1>dxlib_vc\dx_vc\dxlib.h(4712): note: 'DxLib::Set3DSoundListenerPosAndFrontPosAndUpVec' の宣言を確認してください 1>mcraft\tankflanker\tankflanker\route.hpp(232): error C2065: 'camera_main': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(232): error C2672: 'DXDraw::Ready_Shadow': 一致するオーバーロードされた関数が見つかりませんでした。 1>mcraft\tankflanker\tankflanker\route.hpp(243): error C2065: 'camera_main': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(262): error C2065: 'camera_main': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(271): error C3536: 'Hostpassparts': 初期化前に使用することはできません 1>mcraft\tankflanker\tankflanker\route.hpp(271): error C2065: 'camera_main': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(282): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(283): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(286): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(287): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(290): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(291): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(294): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(295): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(300): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(301): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(302): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(309): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(310): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(313): error C2065: 'camera_TPS': 定義されていない識別子です。 1>mcraft\tankflanker\tankflanker\route.hpp(313): error C2672: 'DXDraw::Ready_Shadow': 一致するオーバーロードされた関数が見つかりませんでした。 1>mcraft\tankflanker\tankflanker\route.hpp(317): error C3536: 'Hostpass2parts': 初期化前に使用することはできません 1>mcraft\tankflanker\tankflanker\route.hpp(317): error C2065: 'camera_TPS': 定義されていない識別子です。 前回頂いた DXLib_ref フォルダなどを使用しているのですが、その後変更などあったのでしょうか?
メンテ
Re: モデルのてっぺん付近の当たり判定が取れない? ( No.2 )
名前:名無三 日時:2021/02/02 23:01

今日その部分をDXLib_refに移してそのままでした…明日上げなおします、すいません
メンテ
Re: モデルのてっぺん付近の当たり判定が取れない? ( No.3 )
名前:名無三 日時:2021/02/03 08:35

drive.google.com/file/d/1Toj_PQ2Y2KAz4voWwZa3LFdyxM4zwKj2/view?usp=sharing すいません、お手数ですがDXLib_refの中身をこちらに上書きして再度確認お願いします
メンテ
Re: モデルのてっぺん付近の当たり判定が取れない? ( No.4 )
名前:管理人 日時:2021/02/03 23:37

ありがとうございます 無事実行することができました そして、手元で確認した限りでは block を block_bad に変更してもすり抜けませんでした あと、手元で以下のようなプログラムを組んで block_bad\\b_1\\model.mv1 に対して上から 下方向に向かう線分で当たり判定を行ってみましたが、正常に天辺と当たりました <実行結果のスクリーンショット> https://dxlib.xsrv.jp/temp/MV1CollCheck_LineTest.png #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Model ; // ウィンドウモードで起動 ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // モデルの読み込み Model = MV1LoadModel( "mcraft\\TankFlanker\\TankFlanker\\data\\block_bad\\b_1\\model.mv1" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // カメラの設定 SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 0.0f, -1.667309f ), VGet( 0.000000f, 0.000000f, 0.000000f ) ); SetCameraNearFar( 0.020000f, 5.000000f ); // 当たり判定を行う線分の2頂点の値をセット VECTOR Point1 = VGet( 0.0f, 2.0f, -0.49f ); VECTOR Point2 = VGet( 0.0f, -2.0f, -0.49f ); // メインループ while( ProcessMessage() == 0 ) { ClearDrawScreen() ; // モデルと線分の当たり判定 MV1_COLL_RESULT_POLY Result = MV1CollCheck_Line( Model, -1, Point1, Point2 ); // モデルの描画 MV1DrawModel( Model ) ; // 線分の描画 if( Result.HitFlag ) { // 当たっている場合 DrawLine3D( Point1, Result.HitPosition, GetColor( 0, 255, 0 ) ) ; } else { // 当たっていない場合 DrawLine3D( Point1, Point2, GetColor( 0, 255, 0 ) ) ; } // 裏画面の内容を表画面に反映 ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } よろしければ当たり判定を行う際に Y座標を少しだけ上げてみてください 例えばモデルの天辺にプレイヤーがピッタリついている状態でプレイヤーの位置から 下方向に向かう線分で MV1CollCheck_Line を行った場合、計算誤差が発生して 『天辺当たっていない』と判定される確率が高くなりますので…
メンテ
Re: モデルのてっぺん付近の当たり判定が取れない? ( No.5 )
名前:名無三 日時:2021/02/04 06:54

えっ?!と思いもう一度確認しました。説明不足ですいません、もしかしたらブロックの座標だけで当たり判定を取るモード(移動の確認などでオンにしてました) を使用しているかもしれません。今colcheck関連を使うモードをプッシュしましたのでもう一度確認お願いします(プログラム側の不備も探してみます) 一応自分の(思い込みを含めた)床判定のフローです。 map.hpp 自分の足元(mine.pos)の周囲3ブロック四方のブロックの有無を取る ブロックがあったマスについて足元から上に半ブロックぶんの高さを判定し、当たったら結果を返す route.hpp 垂直の加速(yadd)が正ならジャンプしているので落下扱い 1)map.hppから当たり判定がtrueでジャンプ中じゃない時に足元にあたった座標を代入しyaddを0に 2)ジャンプ中もしくは判定がtrueじゃない時は加速度のyにyaddを加算してからyaddに重力落下ぶんのマイナスの加速を加える という感じです。 今回質問しましたのは、前にFPSを製作していた際にどうしても天辺からだとレーザーポインターや弾がすり抜ける箇所があり (プレイヤーがジャンプをしないようにしていたのでその時はスルーしていました)、それを思い出したからです。 申し訳ありませんが、今一度確認をよろしくお願いします。
メンテ
Re: モデルのてっぺん付近の当たり判定が取れない? ( No.6 )
名前:管理人 日時:2021/02/05 00:05

最新の github.com/yabushita0312/mcraft.git を適用したところ、手元の環境でも すり抜けるようになりました ただ、No.4 で申し上げました通り、MV1CollCheck_Line で mcraft\TankFlanker\TankFlanker\data\block\b_1\model.mv1 等のブロックとの当たり判定は正常に行えていますので、 名無三さんが組まれたプログラム側に原因がある可能性が高いと思います > ブロックがあったマスについて足元から上に半ブロックぶんの高さを判定し、当たったら結果を返す 落下速度による1フレーム辺りの移動距離が半ブロックぶん以上になった場合はすり抜けてしまうと 思うのですが、判定距離は半ブロックぶんで問題ないでしょうか? 試しに1ブロックぶんなどにしてみてください m(_ _)m
メンテ
Re: モデルのてっぺん付近の当たり判定が取れない? ( No.7 )
名前:名無三(解決) 日時:2021/02/05 21:31

解決しました、自分のいる座標にブロックがないと正常な答えを返していなかったからでした… >今回質問しましたのは、前にFPSを製作していた際にどうしても天辺からだとレーザーポインターや弾がすり抜ける箇所があり >(プレイヤーがジャンプをしないようにしていたのでその時はスルーしていました)、それを思い出したからです。 これに関してもミスの可能性があるので見逃してください、すいませんでした…
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存