(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);
// 三角形とレイの交差判定
//------------------------------------------------------------
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