トップページ > 記事閲覧
モデルのメッシュ対線分の当たり判定を行いたい
名前:名無三 日時: 2019/11/14 11:52

毎度お世話になっております。 現状ではフレームと線分やカプセルとでの当たり判定関数は実装されております。 ですが、フレーム毎ですとボーン付きモデルに対しては分割する意味がありません。 そこで、メッシュ毎に判定を取るような関数があると良いなと思いました。 また、モデルビュアーにて複数マテリアルを一括して変更できるようになれば…とも思っております。 もしよろしければお願いします。
メンテ

Page: 1 |

Re: モデルのメッシュ対線分の当たり判定を行いたい ( No.1 )
名前:管理人 日時:2019/11/16 01:29

ご要望承りました メッシュ毎の当たり判定を実装してみようと思いますが、 今のシステムがフレーム単位であることを前提としているので少し時間が掛かるかもしれません 申し訳ありませんが少々お待ちください m(_ _;m ( 最短( 今週末中 )〜最長( 1ヶ月以上 ) )
メンテ
Re: モデルのメッシュ対線分の当たり判定を行いたい ( No.2 )
名前:名無三(待機) 日時:2019/11/16 12:17

ありがとうございます、お待ちしております。
メンテ
Re: モデルのメッシュ対線分の当たり判定を行いたい ( No.3 )
名前:管理人 日時:2019/11/25 01:46

お待たせしました、メッシュ毎に判定できるようにしましたので、 よろしければこちらの機能を追加したバージョンをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下の関数の末尾に MeshIndex という引数を追加しました // コリジョン情報を構築する int MV1SetupCollInfo( int MHandle, int FrameIndex = -1 , int XDivNum = 32 , int YDivNum = 8 , int ZDivNum = 32 , int MeshIndex = -1 ) ; // コリジョン情報の後始末 int MV1TerminateCollInfo( int MHandle, int FrameIndex = -1 , int MeshIndex = -1 ) ; // コリジョン情報を更新する int MV1RefreshCollInfo( int MHandle, int FrameIndex = -1 , int MeshIndex = -1 ) ; // 線とモデルの当たり判定 MV1_COLL_RESULT_POLY MV1CollCheck_Line( int MHandle, int FrameIndex, VECTOR PosStart, VECTOR PosEnd , int MeshIndex = -1 ) ; // 線とモデルの当たり判定( 戻り値が MV1_COLL_RESULT_POLY_DIM ) MV1_COLL_RESULT_POLY_DIM MV1CollCheck_LineDim( int MHandle, int FrameIndex, VECTOR PosStart, VECTOR PosEnd , int MeshIndex = -1 ) ; // 球とモデルの当たり判定 MV1_COLL_RESULT_POLY_DIM MV1CollCheck_Sphere( int MHandle, int FrameIndex, VECTOR CenterPos, float r , int MeshIndex = -1 ) ; // カプセルとモデルの当たり判定 MV1_COLL_RESULT_POLY_DIM MV1CollCheck_Capsule( int MHandle, int FrameIndex, VECTOR Pos1, VECTOR Pos2, float r , int MeshIndex = -1 ) ; // 三角形とモデルの当たり判定 MV1_COLL_RESULT_POLY_DIM MV1CollCheck_Triangle( int MHandle, int FrameIndex, VECTOR Pos1, VECTOR Pos2, VECTOR Pos3 , int MeshIndex = -1 ) ; // 参照用メッシュのセットアップ int MV1SetupReferenceMesh( int MHandle, int FrameIndex, int IsTransform, int IsPositionOnly = FALSE , int MeshIndex = -1 ) ; // 参照用メッシュの後始末 int MV1TerminateReferenceMesh( int MHandle, int FrameIndex, int IsTransform, int IsPositionOnly = FALSE , int MeshIndex = -1 ) ; // 参照用メッシュの更新 int MV1RefreshReferenceMesh( int MHandle, int FrameIndex, int IsTransform, int IsPositionOnly = FALSE , int MeshIndex = -1 ) ; // 参照用メッシュを取得する MV1_REF_POLYGONLIST MV1GetReferenceMesh( int MHandle, int FrameIndex, int IsTransform, int IsPositionOnly = FALSE , int MeshIndex = -1 ) ; MeshIndex はデフォルトで -1 となっていて、FrameIndex の値との組み合わせで以下のように挙動が変化します FrameIndex == -1 && MeshIndex == -1 → 3Dモデル全体( 今までもあった挙動 ) FrameIndex >= 0 && MeshIndex == -1 → FrameIndex のフレーム全体( 今までもあった挙動 ) FrameIndex == -1 && MeshIndex >= 0 → モデル全体の中での MeshIndex が示すメッシュ番号のメッシュ( 今回追加した挙動 ) FrameIndex >= 0 && MeshIndex >= 0 → FrameIndex のフレームに含まれる MeshIndex 番目のメッシュ( 今回追加した挙動 ) よろしければお試しください m(_ _)m
メンテ
Re: モデルのメッシュ対線分の当たり判定を行いたい ( No.4 )
名前:名無三 日時:2019/11/25 11:19

ありがとうございます!…ですが… #include "DxLib.h" #include <cmath> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ int Mx, My; float xr=0.0f, yr=0.0f; MV1_COLL_RESULT_POLY HitPoly; /*あたり判定*/ VECTOR neard,fard; SetOutApplicationLogValidFlag(FALSE); /*log*/ ChangeWindowMode(TRUE); /*窓表示*/ SetUseDirect3DVersion(DX_DIRECT3D_11); /*directX ver*/ DxLib_Init(); /*init*/ int model = MV1LoadModel("38t/col.mv1"); int ok = MV1SetupCollInfo(model, -1, 4, 4, 4, -1); while (ProcessMessage() == 0 && CheckHitKeyAll() == 0) { GetMousePoint(&Mx, &My); SetDrawScreen(DX_SCREEN_BACK); xr = 45.0f / 180.0f*DX_PI_F; yr = 45.0f / 180.0f*DX_PI_F; SetCameraNearFar(0.01f, 6.0f); SetCameraPositionAndTargetAndUpVec(VGet(6.0f*sin(yr)*cos(xr), 6.0f*sin(xr), 6.0f*cos(yr)*cos(xr)), VGet(0, 0, 0), VGet(0, 1, 0)); neard = ConvScreenPosToWorldPos(VGet((float)Mx, (float)My, 0.0f)); fard = ConvScreenPosToWorldPos(VGet((float)Mx, (float)My, 1.0f)); HitPoly = MV1CollCheck_Line(model, -1, neard, fard, -1); SetDrawScreen(DX_SCREEN_BACK); ClearDrawScreen(); xr = 45.0f / 180.0f*DX_PI_F; yr = -45.0f / 180.0f*DX_PI_F; SetCameraNearFar(0.01f, 6.0f); SetCameraPositionAndTargetAndUpVec(VGet(6.0f*sin(yr)*cos(xr), 6.0f*sin(xr), 6.0f*cos(yr)*cos(xr)), VGet(0, 0, 0), VGet(0, 1, 0)); MV1DrawModel(model); DrawLine3D(neard, fard, GetColor(255, 0, 0)); DrawFormatString(0, 0, GetColor(255, 255, 255), "%6.2f,%6.2f,%6.2f \n %6.2f, %6.2f, %6.2f", neard.x, neard.y, neard.z, fard.x, fard.y, fard.z ); DrawFormatString(240, 0, GetColor(255, 255, 255), "canhit=%d\nHitFlag = %d", ok, HitPoly.HitFlag ); ScreenFlip(); } DxLib_End(); return 0; } このようにテスト用のコードを作ってみたところ、 により 0x00007FF7588968DA で例外がスローされました (test.exe 内): 0xC0000005: 場所 0x000002D065FF05BC の読み取り中にアクセス違反が発生しました が発生しました とエラーが出てしまいます… drive.google.com/file/d/1BL5wr7DrR2Hi-1ngfnLLuubU266MqmSs/view?usp=sharing すべてのファイルはこちらになります。
メンテ
Re: モデルのメッシュ対線分の当たり判定を行いたい ( No.5 )
名前:名無三 日時:2019/11/25 11:35

追記 症状はMeshIndexに0以上を指定した際に発生します
メンテ
Re: モデルのメッシュ対線分の当たり判定を行いたい ( No.6 )
名前:管理人 日時:2019/11/26 01:09

すみません、mv1ファイルを読み込んだ場合に正常に処理されない状態となっていました mv1ファイルを読み込んだ場合でも正常にメッシュ単位の当たり判定が行われるように修正したバージョンをアップしましたので 何度も申し訳ありませんが、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: モデルのメッシュ対線分の当たり判定を行いたい ( No.7 )
名前:名無三(解決感謝) 日時:2019/11/26 10:21

動作確認できました!本当にありがとうございます!
メンテ

Page: 1 |

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

   クッキー保存