【问题标题】:Getting the world position/orientation of a VR headset using Unreal C++使用 Unreal C++ 获取 VR 耳机的世界位置/方向
【发布时间】:2019-04-07 04:53:01
【问题描述】:

我需要找到 VR 耳机(Oculus 和 HTC)的世界位置/方向,然后将演员设置在同一位置。获取相机的位置在 VR 中似乎效果不佳,所以我认为这段代码是正确的方法:

FQuat DeviceRotation;
FVector DevicePosition;

GEngine->XRSystem->GetCurrentPose(0, OUT DeviceRotation, OUT DevicePosition);
myActor->SetActorLocation(DevicePosition);
myActor->SetActorRotation(DeviceRotation);

但是,生成的 Z 轴坐标太低,方向不正确。

那么在 C++ 中执行此操作的正确方法是什么?我需要以某种方式考虑播放器控制器吗?

更新:

进一步研究,似乎您必须添加由玩家 pawn 旋转旋转的 HMD 位置:

FQuat DeviceRotation;
FVector DevicePosition;
FVector FinalPosition;

GEngine->XRSystem->GetCurrentPose(IXRTrackingSystem::HMDDeviceId, DeviceRotation, DevicePosition);

APlayerController *PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);
FinalPosition = PlayerController->GetPawn()->GetActorRotation().RotateVector(DevicePosition) + PlayerController->PlayerCameraManager->GetCameraLocation();

myActor->SetActorLocation(FinalPosition);
myActor->SetActorRotation(DeviceRotation);

但是,结果仍然不正确,因为似乎存在旋转偏移。我将相机设置为锁定到 HMD,所以我不确定我还缺少什么。

【问题讨论】:

    标签: c++ unreal-engine4 oculus htc-vive


    【解决方案1】:

    想通了。 GetCurrentPose 仅​​给出 HMD 的偏移位置,因此需要将其添加到玩家 pawn 的变换中,如下所示:

            FQuat hmdRotation;
            FVector hmdLocationOffset;
            GEngine->XRSystem->GetCurrentPose(IXRTrackingSystem::HMDDeviceId, hmdRotation, hmdLocationOffset);
    
            APawn * playerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);
    
            myActor->SetActorLocation(playerPawn->GetTransform().TransformPosition(hmdLocationOffset));
            myActor->SetActorRotation(hmdRotation);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 2021-04-16
      • 2017-02-16
      • 2019-03-20
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2013-01-04
      相关资源
      最近更新 更多