I want to implement an on board GUI where i first select a area and then i can write something in it but i'm stuck in first part where i have to select Billboard Text,
here is my Code for Picking:
POINT ptCursor;
GetCursorPos(&ptCursor);
ScreenToClient(AngelCore::AngelSubSystemResources::WindowProperties::GetHWND(), &ptCursor);
UINT numOfVP = 1;
D3D11_VIEWPORT vp;
AngelCore::AngelSubSystemResources::GraphicDeviceResources::GetDeviceContext3D()->RSGetViewports(&numOfVP, &vp);
DirectX::XMFLOAT3 v;
v.x = (((2.0f * ptCursor.x) / vp.Width) - 1) / proj4X4._11;
v.y = -(((2.0f * ptCursor.y) / vp.Height) - 1) / proj4X4._22;
v.z = -1.0f;
DirectX::XMMATRIX translation = DirectX::XMMatrixTranslation(
DirectX::XMVectorGetX(
AngelCore::AngelSubSystemResources::BaseCameraProperties::BCamera.GetCameraPosition())
, DirectX::XMVectorGetY(
AngelCore::AngelSubSystemResources::BaseCameraProperties::BCamera.GetCameraPosition())
, DirectX::XMVectorGetZ(
AngelCore::AngelSubSystemResources::BaseCameraProperties::BCamera.GetCameraPosition()));
DirectX::XMMATRIX worldView = View;
DirectX::XMMATRIX inv = DirectX::XMMatrixInverse(nullptr, worldView);
DirectX::XMFLOAT4X4 invWorldView4X4;
DirectX::XMStoreFloat4x4(&invWorldView4X4, inv);
DirectX::XMFLOAT3 vPickRayDir;
DirectX::XMFLOAT3 vPickRayOrig;
vPickRayDir.x = v.x * invWorldView4X4._11 + v.y * invWorldView4X4._21 + v.z * invWorldView4X4._31;
vPickRayDir.y = v.x * invWorldView4X4._12 + v.y * invWorldView4X4._22 + v.z * invWorldView4X4._32;
vPickRayDir.z = v.x * invWorldView4X4._13 + v.y * invWorldView4X4._23 + v.z * invWorldView4X4._33;
vPickRayOrig.x = invWorldView4X4._41;
vPickRayOrig.y = invWorldView4X4._42;
vPickRayOrig.z = invWorldView4X4._43;
DirectX::XMFLOAT3 rayObjOrigin, rayObjDirection;
DirectX::XMVECTOR rayOrig = DirectX::XMVector3TransformCoord(DirectX::XMVectorSet(
vPickRayOrig.x, vPickRayOrig.y, vPickRayOrig.z, 1.0f), invWorld);
DirectX::XMVECTOR rayDir = DirectX::XMVector3TransformNormal(DirectX::XMVectorSet(
vPickRayDir.x, vPickRayDir.y, vPickRayDir.z, 1.0f), invWorld);
rayDir = DirectX::XMVector3Normalize(rayDir);
float dist = 0;
if (b.Intersects(rayOrig,
rayDir, dist))
{
return true;
}
Here is the details:
Matrix translation do nothing.
"b" is the bounding box from the object that i want to check for ray intersection.
I also pass inverse world matrix to this function.
My code won't work correctly,it's like bounding box is moving with camera,every time i move camera it shows intersection in different position!