[UE Climbing] 1. Climbing Movement

2025. 3. 28. 22:23·강의/UE Climbing System
해당 카테고리 글들은 Unreal Engine 5 C++: 클라이밍 시스템 구축하기를 수강하고 공부한 내용을 정리한 글입니다.
강의 바로가기

 

첫 번째 섹션 - 클라이밍 움직임 강의 내용이 많아 그중 중요하다고 생각한 부분만 정리했습니다.

먼저, 첫 번째 섹션에 대해 정리한 글은 아래와 같습니다.

첫 번째 섹션에서는 클라이밍을 위한 이동을 어떻게 처리할 수 있는지 살펴보고, 기본적인 클라이밍 논리를 처리할 수 있도록 새로운 향상된 입력과 사용자 정의 이동 컴포넌트로 시작합니다. 그런 다음 다양한 트레이스를 사용하여 우리가 필요한 모든 클라이밍 가능한 표면 정보를 얻고, 캐릭터를 사용자 정의 이동 모드로 이동시키기 위해 필요한 물리학 코드를 처리하는 방법을 다룹니다. 물리학이 작동하면, 모든 클라이밍 가능한 표면 정보를 처리하고, 클라이밍을 위한 속도와 회전을 계산합니다.

 

먼저, 가독성을 위해 #pragma region과 #pragma endregion을 사용했습니다.

 #pragma region ClimbTraces
 	
 	TArray<FHitResult> DoCapsuleTraceMultiByObject(const FVector& Start,const FVector& End,bool bShowDebugShape = false);
 
 #pragma endregion

클라이밍 이동을 위해 CharacterMovementComponent 을 상속받은 CustomMovementComponent 에 구현했습니다. 또한 Movement Mode 에 MOVE_Custom 을 사용했습니다.

 

클라이밍 시 캐릭터 주변의 클라이밍 가능한 표면들을 탐지하기 위해 캡슐 형태의 트레이스를 수행했습니다.

 

이때 CharacterMovementComponent 안에서 어떻게 액터 위치나 그런 정보를 얻을 수 있을까?

 

UpdatedComponent는 MovementComponent가 실제로 이동(Transform 변경) 및 물리 계산을 적용할 SceneComponent를 가리키는 포인터입니다. 이를 사용하면 아래와 같이 시작, 끝 위치를 구할 수 있습니다.

void UCustomMovementComponent::TraceClimbableSurfaces()
 {
	 const FVector StartOffset = UpdatedComponent->GetForwardVector() * 30.f;
 	const FVector Start = UpdatedComponent->GetComponentLocation() + StartOffset;
 	const FVector End = Start + UpdatedComponent->GetForwardVector();
 
 	DoCapsuleTraceMultiByObject(Start,End,true);
 }

 

클라이밍 중에 정상에 도달했는지 여부를 판단하기 위해 위와 비슷하게 눈 높이에 시작하는 라인 트레이스를 생성했습니다.

 

물리 기반 클라이밍은 아래와 같이 구현합니다.

 

1. Compute Climbable Surface Info

위 코드를 통해 Climable Surface Location, Climable Surface Normal을 구했습니다.

이 경우 아래와 같이 결과가 나옵니다.

 

2. Climb Velocity

클라이밍 중인지 아닌지에 따라 최대 속도, 가속도 다르게 설정합니다.

 

3. Climb Rotation

CurrentClimbableSurfaceNormal을 음수로 해야 캐릭터가 벽을 보는 방향이 됩니다.

현재 회전에서 목표 회전으로 보간처리합니다.

 

4. Snap Movement To Surface

캐릭터가 등반 가능한 표면에 정확하게 위치하도록, 표면과의 거리를 계산해 보정 이동을 적용합니다. 이제 표면에 따라 이동할 수 있습니다. 다만 현재는 이동이 좌우만 됩니다.

 

이제 클라이밍 모드일 때는 위아래나 좌우로만 이동하도록 처리하고자 합니다.

 

cross product(외적)는 3차원 벡터 공간에서 두 벡터로부터 새로운 벡터를 만들어내는 연산입니다. 두 벡터 a와 b의 교차 곱 a×b는 a와 b 모두에 수직인 벡터

 

언리얼에서는 오른손 규칙 대신 왼손 규칙을 사용해야 합니다. 현재 그림은 위로 이동하는 거로 오른쪽으로 이동하고 싶다면 왼손을 90도로 회전하면 됩니다.

 

ForwardDirection보면 cross product으로 a는 역표면 법선 벡터고 b는 오른쪽 방향벡터입니다.

 

이제 클라이밍 상태이면 WASD로 위아래 좌우 이동 가능합니다.

 

이제 클라이밍을 하다가 위의 평평한 지면에 도달하면 클라이밍 상태를 멈추도록 구현하려고 합니다.

현재 문제점

 

현재 우리는 등반 가능한 표면 법선을 알고 있습니다. 평지에 도달하면 그 평면의 법선은 위쪽을 향하게 됩니다. 업 벡터.

그러므로 표면 노멀이랑 업 벡터를 비교만 하면 됩니다. 두 벡터 사이의 각도가 일정 각보다 작으면 클라이밍을 중지하도록 구현합니다.

 

Dot Product(내적)은 두 벡터 사이의 관계를 나타내는 연산

 

업 벡터와 표면 법의 내적을 구하고 그 값에 accosine함수를 적용합니다. 그다음 결과가 라디안 단위이므로 도 단위로 변환합니다. 사이각이 60도 이내면 true를 리턴해 클라이밍 상태를 끝냅니다.

 

[첫 번째 섹션 - 클라이밍 움직임] 구현 결과 영상입니다. 

 

 

 

'강의 > UE Climbing System' 카테고리의 다른 글

[UE Climbing] 2-2. Climbing Animation  (5) 2025.04.14
[UE Climbing] 2-1. Climbing Animation  (0) 2025.04.14
'강의/UE Climbing System' 카테고리의 다른 글
  • [UE Climbing] 2-2. Climbing Animation
  • [UE Climbing] 2-1. Climbing Animation
개발자 밍
개발자 밍
dev0404 님의 블로그 입니다.
  • 개발자 밍
    Developer
    개발자 밍
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • 강의 (8)
        • UE Climbing System (3)
        • UE Dungeon (1)
        • HCI (4)
      • 책 (18)
        • 객체지향의 사실과 오해 (5)
        • Effective C++ (3)
        • 이득우의 게임 수학 (4)
        • 이것이 취업을 위한 컴퓨터 과학이다 (4)
        • 리뷰 (2)
      • C++ (2)
      • 알고리즘 (2)
      • 자료구조 (1)
      • Unreal (4)
      • 내일배움캠프 (52)
        • TIL (52)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    게임수학
    자료구조
    컴퓨터 구조
    객체지향
    컴퓨터구조
    그래픽스
    c++
    언리얼
    Effective
    내일배움캠프
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
개발자 밍
[UE Climbing] 1. Climbing Movement
상단으로

티스토리툴바