我需要找到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,所以我不确定这里还缺少什么。
答案 0 :(得分:0)
弄清楚了。 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);