Получение мировой позиции / ориентации гарнитуры VR с использованием Unreal C ++ - PullRequest
0 голосов
/ 03 ноября 2018

Мне нужно найти мировую позицию / ориентацию гарнитуры VR (как Oculus, так и HTC), а затем установить актера в том же месте. Получение положения камеры, кажется, не работает в VR, поэтому я подумал, что этот код был правильным способом сделать это:

FQuat DeviceRotation;
FVector DevicePosition;

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

Однако полученные координаты слишком малы по оси Z, и ориентация не соответствует должным образом.

Так, как правильно сделать это в C ++? Нужно ли как-то учитывать контроллер плеера?

UPDATE:

Если взглянуть на это подробнее, вам, похоже, нужно добавить позицию 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, поэтому я не уверен, что еще мне здесь не хватает.

1 Ответ

0 голосов
/ 06 ноября 2018

Разобрался. GetCurrentPose дает только позицию смещения для HMD, поэтому ее необходимо добавить к преобразованию пешки игрока, например:

        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);
...