bool FStrategyHelpers::DeprojectScreenToWorld(const FVector2D& ScreenPosition, ULocalPlayer* Player, FVector& RayOrigin, FVector& RayDirection) { if (Player != NULL && Player->ViewportClient != NULL && Player->ViewportClient->Viewport != NULL && Player->PlayerController != NULL) { //get the projection data FSceneViewProjectionData ProjectionData; if (Player->GetProjectionData(Player->ViewportClient->Viewport, eSSP_FULL, /*out*/ ProjectionData)) { const FMatrix ViewMatrix = FTranslationMatrix(-ProjectionData.ViewOrigin) * ProjectionData.ViewRotationMatrix; const FMatrix InvViewMatrix = ViewMatrix.InverseFast(); const FMatrix InvProjectionMatrix = ProjectionData.ProjectionMatrix.InverseFast(); FSceneView::DeprojectScreenToWorld(ScreenPosition, ProjectionData.GetConstrainedViewRect(), InvViewMatrix, InvProjectionMatrix, /*out*/ RayOrigin, /*out*/ RayDirection); return true; } } return false; }
bool FProjectionUtils::DeprojectScreenToWorld(const FVector2D& screenPosition, ULocalPlayer* player, FVector& rayOrigin, FVector& rayDirection) { if (player != nullptr && player->ViewportClient != nullptr && player->ViewportClient->Viewport != nullptr && player->PlayerController != nullptr) { // get the projection data FSceneViewProjectionData projectionData; if (player->GetProjectionData(player->ViewportClient->Viewport, eSSP_FULL, /*out*/ projectionData)) { const FMatrix viewMatrix = FTranslationMatrix(-projectionData.ViewOrigin) * projectionData.ViewRotationMatrix; const FMatrix inversedViewMatrix = viewMatrix.InverseFast(); const FMatrix inversedProjectionMatrix = projectionData.ProjectionMatrix.InverseFast(); FSceneView::DeprojectScreenToWorld(screenPosition, projectionData.GetConstrainedViewRect(), inversedViewMatrix, inversedProjectionMatrix, /*out*/ rayOrigin, /*out*/ rayDirection); return true; } } return false; }