C++でクライアント座標をワールド座標に変換してマウスカーソルのワールド座標を取得しようとしています。
(X,Y座標のみとれれば問題ないのですが)
DirectXMathを使用して
http://www.marupeke296.com/DXG_No48_PointGroundInScreen.html
↑のサイトを参考に作成してみましたがなかなかうまくいきません。
どのように間違っているのかが分からず途方に暮れてしまっています。
どこが間違っているのかアドバイスをお願いしたいです。
実行して数値を見てみると
x,y,zともに [-nan(ind)]と出ます。
// 関数呼び出し
POINT *mousePos = CInput::GetMousePosition();
XMFLOAT2 mouse = XMFLOAT2(mousePos->x, mousePos->y);
XMFLOAT3 worldPos;
XMMATRIX view, proj;
view = XMLoadFloat4x4(&CSceneManager::GetScene()->GetCamera()->GetViewMatrix());
proj = XMLoadFloat4x4(&CSceneManager::GetScene()->GetCamera()->GetProjMatrix());
CalcScreenToXY(
&worldPos,// ワールド座標
mouse.x,// クライアント座標X
mouse.y,// クライアント座標Y
SCREEN_WIDTH,// スクリーンサイズW
SCREEN_HEIGHT,// スクリーンサイズH
&view,// ビュー行列
&proj// プロジェクション行列
);
XMFLOAT3* CalcScreenToWorld(
XMFLOAT3* pout,
int Sx,
int Sy,
float fZ,
int ScreenW,
int ScreenH,
XMMATRIX* view,
XMMATRIX* prj
)
{
XMMATRIX InvView, InvPrj, VP, InvViewport;
InvView = XMMatrixInverse(nullptr, *view);
InvPrj = XMMatrixInverse(nullptr, *prj);
VP = XMMatrixIdentity();
XMFLOAT4X4 mtx;
XMStoreFloat4x4(&mtx, VP);
mtx._11 = ScreenW / 2.0f;
mtx._22 = -ScreenH / 2.0f;
mtx._41 = ScreenW / 2.0f;
mtx._42 = ScreenH / 2.0f;
VP = XMLoadFloat4x4(&mtx);
InvViewport = XMMatrixInverse(nullptr, VP);
// 逆行列
XMMATRIX tmp = InvViewport * InvPrj * InvView;
XMVECTOR mat = XMLoadFloat3(pout);
XMVECTOR vec = XMVector3TransformCoord(mat, tmp);
XMStoreFloat3(pout, vec);
return pout;
}
XMFLOAT3* CalcScreenToXY(
XMFLOAT3* pout,
int Sx,
int Sy,
int ScreenW,
int ScreenH,
XMMATRIX* pView,
XMMATRIX* pPrj
)
{
XMFLOAT3 nearpos = XMFLOAT3(0.0f, 0.0f, 0.0f);
XMFLOAT3 farpos = XMFLOAT3(0.0f, 0.0f, 0.0f);
XMFLOAT3 ray = XMFLOAT3(0.0f, 0.0f, 0.0f);
CalcScreenToWorld(&nearpos, Sx, Sy, 0.0f, ScreenW, ScreenH, pView, pPrj);
CalcScreenToWorld(&farpos, Sx, Sy, 1.0f, ScreenW, ScreenH, pView, pPrj);
ray = XMFLOAT3(farpos.x - nearpos.x, farpos.y - nearpos.y, farpos.z - nearpos.z);
XMStoreFloat3(&ray, XMVector3Normalize(XMLoadFloat3(&ray)));
if (ray.y <= 0)
{
// 平面交点
XMFLOAT3 v = XMFLOAT3(0.0f, 1.0f, 0.0f);
XMVECTOR Lray = XMVector3Dot(XMLoadFloat3(&ray), XMLoadFloat3(&v));
XMFLOAT3 v2 = XMFLOAT3(0.0f, 1.0f, 0.0f);
nearpos.x *= -1.0f;
nearpos.y *= -1.0f;
nearpos.z *= -1.0f;
XMVECTOR LP0 = XMVector3Dot(XMLoadFloat3(&nearpos), XMLoadFloat3(&v2));
//*pout = nearpos + (LP0 / Lray)*ray;
XMFLOAT3 lp0;
XMStoreFloat3(&lp0, LP0);
XMFLOAT3 lray;
XMStoreFloat3(&lray, LP0);
*pout = XMFLOAT3
(nearpos.x + (lp0.x / lray.x)*ray.x,nearpos.y + (lp0.y / lray.y)*ray.y,nearpos.z + (lp0.z / lray.z)*ray.z);
}
else *pout = farpos;
return pout;
}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/27 10:28
2021/08/27 10:47 編集
2021/08/27 10:48
2021/08/27 11:49