본문 바로가기

강동새싹언리얼수업/언리얼

C++ Oculus Touch(Motion Controller)를 포함한 Pawn 생성하기

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