UE4 使用CPU实现获取ViewSize,并实现广告牌精确鼠标拾取

2 篇文章 0 订阅
  • 获取viewSize
APlayerController* controller = UGameplayStatics::GetPlayerController(World, 0);
ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(controller->Player);  
FSceneView* View = nullptr;  
FIntPoint ViewSize = LocalPlayer->ViewportClient->Viewport->GetSizeXY();
if (LocalPlayer)  
{  
   // Create a view family for the game viewport  
   FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(  
         LocalPlayer->ViewportClient->Viewport,  
         GetWorld()->Scene,  
         LocalPlayer->ViewportClient->EngineShowFlags)  
      .SetRealtimeUpdate(true));  
   // Calculate a view where the player is to update the streaming from the players start location  
   FVector ViewLocation;  
   FRotator ViewRotation;  
   View = LocalPlayer->CalcSceneView(&ViewFamily, /*out*/ ViewLocation, /*out*/ ViewRotation, LocalPlayer->ViewportClient->Viewport);  
}
  • 实现顶牌精确鼠标点击
FVector2D PickUV()  
{  
   // return FVector2D(0.3,0.2);  
   //获取中心点  
   auto World = GWorld->GetGameInstance()->GetWorld();  
   APlayerController* controller = UGameplayStatics::GetPlayerController(World, 0);  
   APlayerCameraManager* manager = UGameplayStatics::GetPlayerCameraManager(World, 0);  
   if( !controller || !controller->PlayerCameraManager )  
      return FVector2D::ZeroVector;  
     
   //获取鼠标点击位置  
   float mousePositionX, mousePositionY;  
   controller->GetMousePosition(mousePositionX, mousePositionY);  
     
   //part1 zoom size  
   auto keepSize = this->BKeepSize ? 1.0f : 0.0f;  
   auto spritePositionWS = this->GetActorTransform().GetLocation();  
   FVector2D spritePositionSS = FVector2D::ZeroVector;  
   UUnrealUtils::ProjectWorldSpaceToScreenSpace(controller,spritePositionWS,spritePositionSS);  
   auto cameraPositionWS = manager->GetRootComponent()->GetComponentTransform().GetLocation();  
   auto disObjToCam = FVector::Distance(spritePositionWS,cameraPositionWS);  
   auto subObjToCam = spritePositionWS - cameraPositionWS;  
   subObjToCam.Normalize();  
   auto cameraDirectionVector = manager->GetRootComponent()->GetComponentTransform().ToMatrixNoScale().TransformVector(FVector(1, 0, 0));  
   auto dot = FVector::DotProduct(subObjToCam, cameraDirectionVector);  
   auto disObjToCamSize = dot * disObjToCam;  
   auto disSize = FMath::Lerp(this->ScreenSizeScale / 0.0025f / disObjToCamSize, 1.0f, keepSize);  
   //part1 sprite size  
   auto SpriteSize= GetSpriteSize();  
   FVector scale = this->GetTransform().GetScale3D();  
   float maxScaleFactor = FMath::Max3(scale.X, scale.Y, scale.Z);  
   SpriteSize *= maxScaleFactor;  
  
   //获取到左上角的点(0,0)的屏幕坐标位置然后求比例  
   float originX, originY;  
   FVector2D pickLocation = FVector2D::ZeroVector;  
   if (!this->BKeepSize)  
   {  
      auto realScreenResolution = SpriteSize / 2 * disSize;  
      originX = spritePositionSS.X - realScreenResolution.X;  
      originY = spritePositionSS.Y - realScreenResolution.Y;  
      pickLocation.Set((mousePositionX - originX) / (SpriteSize.X * disSize), (mousePositionY - originY) / (SpriteSize.Y * disSize));  
   }  
   else  
   {  
      auto realScreenResolution = SpriteSize / 2 ;  
      originX = spritePositionSS.X - realScreenResolution.X;  
      originY = spritePositionSS.Y - realScreenResolution.Y;  
      pickLocation.Set((mousePositionX - originX) / (SpriteSize.X * disSize), (mousePositionY - originY) / (SpriteSize.Y * disSize));  
   }  
   return pickLocation;//,图片左上角为(0,0),左下角为(1,1),返回的pickLocation中的x和y介于0~1  
}
  • 最终效果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dawn·张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值