このブログを検索

2020年1月12日日曜日

【C++】 DirectX11 - 三角形とレイの交差判定

【C++】 DirectX11 - 三角形とレイの交差判定
(2020年1月12日)


■使用ソフト
・Visual Studio Community 2019


■目次
Visual Studio Community 2019 - C++


■言語
・C/C++
 プロジェクトの「プロパティ」→「C/C++」→「言語」→
 C++言語標準:プレビュー - 最新の C++ Working Draft からの機能 (/std:c++latest)
 を選択


■Windows SDK バージョン
・10.0.18362.0
 プロジェクトの「プロパティ」→「全般」→Windows SDK バージョン:10.0.18362.0
 を選択


■手順
1.Visual Studio 2019を起動する。

2.Windowsデスクトップウィザードを選択して、「次へ」を選択する。

3.プロジェクト名、保存場所、ソリューション名を適宜変更して、「作成」を選択する。

4.アプリケーションの種類を「デスクトップアプリケーション(.exe)」にし、
  追加のオプションの「空のプロジェクト」を選択し、「OK」を選択する。

5.テクスチャファイル等を準備する。

6.以下の6つのファイルを作成してビルドを行う。
(1)Main.h
(2)Main.cpp
(3)DirectX.h
(4)DirectX.cpp
(5)VertexShader.hlsl
(6)PixelShader.hlsl
※VertexShaderとPixelShaderはShader Model 5.0
プロパティ→「HLSL コンパイラ」→「全般」→シェーダーモデル:Shader Model 5.0を選択

※コード抜粋
    //------------------------------------------------------------
    // 三角形とレイの交差判定
    //------------------------------------------------------------
    POINT mousepoint_c;//マウス位置
    GetCursorPos(&mousepoint_c);//マウスのスクリーン座標取得
    ScreenToClient(Window::GethWnd(), &mousepoint_c);//スクリーン座標をクライアント座標(アプリケーションの左上を(0, 0))に変換
    DirectX::XMVECTOR pos_near = DirectX::XMVectorSet(static_cast<float>(mousepoint_c.x), static_cast<float>(mousepoint_c.y), 0.0f, 0.0f);
    DirectX::XMVECTOR pos_near2 = DirectX::XMVector3Unproject(pos_near, 0, 0, vp.Width, vp.Height, vp.MinDepth, vp.MaxDepth, m_matProjection, m_matView, m_matWorld);
    DirectX::XMVECTOR pos_far = DirectX::XMVectorSet(static_cast<float>(mousepoint_c.x), static_cast<float>(mousepoint_c.y), 1.0f, 0.0f);
    DirectX::XMVECTOR pos_far2 = DirectX::XMVector3Unproject(pos_far, 0, 0, vp.Width, vp.Height, vp.MinDepth, vp.MaxDepth, m_matProjection, m_matView, m_matWorld);
    float fRayDistance;
    //三角形の3頂点をセット
    DirectX::XMVECTOR v0 = DirectX::XMVectorSet(svMap[0].Pos.x, svMap[0].Pos.y, svMap[0].Pos.z, 0.0f);
    DirectX::XMVECTOR v1 = DirectX::XMVectorSet(svMap[1].Pos.x, svMap[1].Pos.y, svMap[1].Pos.z, 0.0f);
    DirectX::XMVECTOR v2 = DirectX::XMVectorSet(svMap[2].Pos.x, svMap[2].Pos.y, svMap[2].Pos.z, 0.0f);
    //交差判定
    bool bRayHit = DirectX::TriangleTests::Intersects(pos_near2, DirectX::XMVector3Normalize(DirectX::XMVectorSubtract(pos_far2, pos_near2)), v0, v1, v2, fRayDistance);

7.実行結果
頂点インデックス0-1-2の三角形にマウスカーソルを合わせると
RayHitが1になり、RayDistanceにカメラ位置から交点(三角形とレイの交点)までの距離が格納される。


■参考文献
当たり判定

Intersects(XMVECTOR, XMVECTOR, XMVECTOR, XMVECTOR, XMVECTOR, float&) method

XMVector3Unproject function

XMVectorSubtract function