0-4. 스타트 콘텐츠를 포함한 C++ 공백 프로젝트를 기준으로 하며, Oculus Rift Setup 및 플러그인에 대해서는 이미 알고 있다고 생각하고 따로 설명하지 않도록 하겠습니다.
0-5. 테스트 엔진 버전은 5.2 버전입니다.
1-1. 새로운 C++ 클래스를 Pawn 기반으로 생성하여 Motion Controller를 붙일 폰을 생성합니다.
1-2. 이번 포스팅에서는 이 폰의 이름을 'VRPawn'이라고 명명하겠습니다.
2-1. 'VRPawn.h'를 열어 아래와 같이 Motion Controller를 선언해줍니다.
[소스1]
// 좌측 모션 컨트롤러
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VR")
class UMotionControllerComponent* LeftController;
// 우측 모션 컨트롤러
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VR")
class UMotionControllerComponent* RightController;
// 좌측 모션 컨트롤러 메쉬
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VR")
class UStaticMeshComponent* LeftHand;
// 우측 모션 컨트롤러 메쉬
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VR")
class UStaticMeshComponent* RightHand;
2-2. 'VRPawn.cpp'를 열어 필요한 헤더들을 추가해줍니다.
[소스2]
#include "MotionControllerComponent.h"
#include "Runtime/Engine/Classes/Components/StaticMeshComponent.h"
#include "Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h"
2-3. 생성자에서 아래와 같이 Motion Controller를 Setup 해줍니다.
2-4. 참고) EControllerHand를 이용하여 모션 컨트롤러가 좌측 손인지 우측 손인지를 선택해줄 수 있습니다.
[소스3]
// 씬 루트 컴포넌트
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
// 좌측 모션 컨트롤러 초기화
LeftController = CreateDefaultSubobject<UMotionControllerComponent>(FName("LeftController"));
LeftController->Hand = EControllerHand::Left;
LeftController->SetupAttachment(RootComponent);
// 우측 모션 컨트롤러 초기화
RightController = CreateDefaultSubobject<UMotionControllerComponent>(FName("RightController"));
RightController->Hand = EControllerHand::Right;
RightController->SetupAttachment(RootComponent);
// 좌측 모션 컨트롤러 메쉬 초기화
LeftHand = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("LeftHand"));
LeftHand->SetupAttachment(LeftController);
static ConstructorHelpers::FObjectFinder<UStaticMesh> LeftHandMesh(TEXT("/Game/StarterContent/Shapes/Shape_Cube"));
if (LeftHandMesh.Succeeded())
{
LeftHand->SetStaticMesh(LeftHandMesh.Object);
}
// 우측 모션 컨트롤러 메쉬 초기화
RightHand = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("RightHand"));
RightHand->SetupAttachment(RightController);
static ConstructorHelpers::FObjectFinder<UStaticMesh> RightHandMesh(TEXT("/Game/StarterContent/Shapes/Shape_WideCapsule"));
if (RightHandMesh.Succeeded())
{
RightHand->SetStaticMesh(RightHandMesh.Object);
}
// 플레이어 빙의
AutoPossessPlayer = EAutoReceiveInput::Player0;
Colored by Color Scripter
3-1. 실제로 정상 동작하는지 확인합니다.
C++에서 VR HMD의 정보를 가져오거나 설정하기
0-1. 이번 포스팅은 C++을 이용하여 VR HMD의 Orientation 및 Position을 직접 가져오거나 수정하는 매우 간단한 예제를 작성하도록 하겠습니다.
0-2. 물론 Orientation 및 Position은 물론, HMD의 Device 이름(GetHMDDeviceName())이나 활성화 여부(EnableHMD(bool bEnable)) 등의 정보도 접근하여 가져오거나 설정할 수 있으니 테스트해보시기 바랍니다.
0-3. 디테일한 응용에 대해서는 이후 기회와 시간이 허락하면 작성하도록 하겠습니다.
0-4. 테스트 엔진 버전은 4.17.2 버전입니다.
1-1. 직접 VR HMD에 접근하기 위한 C++ 클래스를 만듭니다.
1-2. 해당 소스 코드를 호출할 수 있다면 클래스가 Actor 기반이든 GameModeBase 기반이든 무엇이라도 상관없습니다.
2. 생성한 C++ 클래스의 cpp 파일에 아래와 같이 필요한 헤더를 추가해줍니다.
[소스1]
#include "HeadMountedDisplayFunctionLibrary.h"
3-1. '소스2'와 같이 구현해주시면 됩니다.
3-2. 소스 코드를 호출하려는 시점에 따라 작성할 위치가 다르기 때문에, 이번 포스팅에서는 소스 코드 내용만 올리도록 하겠습니다.
[소스2]
// 현재 VR HMD의 Orientation 및 Position을 저장
FRotator DeviceRotation;
FVector DevicePosition;
UHeadMountedDisplayFunctionLibrary::GetOrientationAndPosition(DeviceRotation, DevicePosition);
// 현재 VR HMD의 Orientation 및 Position을 리셋
// 첫번째 인수는 Yaw 축의 회전 값이며, 두번째 인수는 'EOrientPositionSelector::Type'형이 들어갑니다.
// 'EOrientPositionSelector::Orientation'을 두번째 인수로 넣으면 Yaw 축의 회전 값만 첫번째 인수 값으로 수정됩니다.
// 'EOrientPositionSelector::Position'을 두번째 인수로 넣으면 첫번째 인수 값과 무관하게 위치만 리셋됩니다.
// 두번째 인수에 아무것도 넣지 않으면 Default로 Yaw 축의 회전 값을 첫번째 인수 값으로 수정하며 위치도 함께 리셋시킵니다.
UHeadMountedDisplayFunctionLibrary::ResetOrientationAndPosition(
'언리얼수업 > 언리얼' 카테고리의 다른 글
231218 VR수업 (0) | 2023.12.18 |
---|---|
231218 Unreal VR Site (1) | 2023.12.18 |
231215 VR Character (0) | 2023.12.17 |
OPENXR (0) | 2023.12.15 |
231214 VR First (0) | 2023.12.14 |