TIL_0010 (vector, rotator, collision, scene, combine, relative, physics)

김펭귄·2025년 8월 8일

Today What I Learned (TIL)

목록 보기
10/109
post-thumbnail

Vector VS Rotator

Vector

  • 기하와 벡터에서 배웠던 vector와 동일

  • 방향, 크기를 가지며 (x, y, z) 값으로 표현

  • Actor의 location을 표현하기 위해 vector가 사용되는데, 월드 좌표계에서의 원점을 시작으로 벡터의 끝 방향이 위치하는 곳이 해당 actor의 location임을 의미

Forward Vector

  • 해당 물체가 바라보는 방향 (길이는 1)

  • 대부분 local 좌표계에서의 x축 방향을 가리키며 mesh의 앞방향도 x축으로 맞추는게 좋음

  • local의 좌표계와 별개로 각 component들도 자기만의 transform을 가질 경우 자기만의 좌표계를 또 가짐

Rotator

  • 물체의 회전 각도를 표시하는 자료형으로, (Roll, Pitch, Yaw)의 3개의 값으로 이루어짐

  • 각 3개의 값은 각 축에 대해 얼마나 회전되어 있는지를 가리키는 실수값

  • Rotator를 벡터로 변환할 수 있는데 이 때의 벡터는 해당 물체의 forward vector와 동일

  • 마찬가지로 transform을 가지는 각 component들은 자기만의 rotator 값을 가짐

콜리전

문 만들어보기

  • collision box와 overlap을 이용해 플레이어가 접근 시 문이 열리도록 구현

  • 그러나 문의 가운데를 축으로 회전하는 현상 발생

DefaultSceneRoot

  • 액터의 이동, 회전 같은 트랜스폼은 기본적으로 Root Component를 기준으로 작동

  • 보통 액터의 최상위 루트는 DefaultSceneRoot이므로 여기에 맞추어 mesh를 이동

  • 그러면 DefaultSceneRoot를 기준으로 회전이 일어나게 된다

  • 결과

Collision

  • 언리얼 엔진에서의 collision system은 2가지 기반으로 동작
  1. Object Channel

  2. Trace Channel

Object Channel

  • 실제 물리적 충돌(Physics Collision) 시에 두 오브젝트가 어떻게 반응할지를 결정

  • 오브젝트 유형을 정의하여, 서로 다른 타입의 오브젝트 간 충돌 여부와 방식을 설정

  • Object Type

    • WorldStatic: 움직이지 않는 액터 (Static Mesh Actor)
    • WorldDynamic: 애니메이션 또는 코드의 영향 아래 움직이는 액터(ex:Door)
    • Pawn: 플레잉어 제어 엔티티 (Character)
    • PhysicsBody: 피직스 시뮬레이션으로 인해 움직이는 모든 액터
    • Vehicle: Vehicle type
    • Destructible: Destructable mesh
  • 해당 컴포넌트의 Object type도 설정 가능

  • 여러 종류의 preset들이 있으므로 원하는 것을 사용하거나 규칙 추가 가능

Trace Channel

  • 레이캐스트(ray cast), 선형 추적(line trace), 구체 추적(sphere trace) 등 트레이스 명령에서 어떤 오브젝트가 감지될지, 혹은 무시할지를 제어

  • 특정 범위나 경로를 검사할 때, 어떤 타입의 오브젝트에 반응할지 정하는 채널

  • Collision 설정 내 Trace Channel에서 커스텀 채널을 추가하거나 기본 채널(Visibility, Camera 등)을 사용할 수 있습니다.

WorldStatic과의 접촉으로만 터지는 트럭 구현

기존 폭발 트럭

  • 기존 폭발 트럭을 기반으로 collision preset 변경, hit event 발생하도록 체크
  • WorldStatic에만 collision하도록 세팅

WorldStatic 물체

  • hit event 발생하도록 체크, Object Type변경

결과

Static Mesh Collision 변경

  • mesh file을 들어가 collision 부위를 확인 가능

  • collision 탭을 통해 여러 종류의 collision을 추가 가능. auto는 자동으로 알맞게 생성

  • Hull Count: 메시를 몇 개의 Convex Hull(충돌 영역)로 분해할지 지정하는 옵션
  • Max Hull Verts: Convex Hull을 구성하는 최대 정점(Vertex)의 개수
  • Hull Precision: 정확도 또는 정밀도(Precision)
  • 이 3가지를 조절하여 collision의 정밀도 설정

Interactive World 만들어보기

  • 언리얼에서 모든 Interaction은 Event로 취급, 다루어짐

  • Interaction의 실행 단계

    1. Event 노드 (시작점): BeginPlay, Tick, Overlap, Hit 등
    2. 조건 처리: “누가 들어왔지?”, “타이머 다 됐나?” 등 판단
    3. 실행: Timeline 재생, 문 열기, 파티클 (이펙트) 재생 등

Interaction의2종류

  • 크게 overlaphit가 존재

  • overlap: 물리 현상 없이 그냥 통과하면서 겹침을 인지 (통과)

  • hit: 부딪히는 물리 현상 존재하며 부딪혔다는 것을 인지 (충돌)

Scene Component

  • 위 내용 중 회전문을 만드는 과정에서 Static MeshBox CollisionDefaultSceneRoot의 오른쪽으로 옮기는 과정이 있었음

  • 하지만 이 경우엔 문이 돌아갈 때 Box Collision도 같이 회전하는 현상이 발생함

  • 따라서 특정 컴포넌트만을 회전시키거나 이동시키고 싶을 때 Scene 컴포넌트의 자식으로 설정하는 방법이 존재

  • Scene 컴포넌트는 위치(Location), 회전(Rotation), 크기(Scale) 같은 3D 트랜스폼(transform) 정보를 가지고 있는 컴포넌트이다

  • Transform을 이용해 하나의 액터 안에서도 여러 컴포넌트들을 각각 원하는대로 이동, 회전, 확대시킬 수 있다

Add VS Combine

  • 회전을 적용하고 또 회전을 적용하는 경우, Rotator에 Add로 Rotator를 적용하는 것은 문제가 발생할 수 있다

  • 단순 덧셈이므로, 축별 회전 범위(-180~180도 등)를 초과할 수 있고, 회전하면서 바뀐 축 때문에 원하는 회전값이 나오지 않을 수 있다

  • 따라서 rotator 계산에는 Combine 함수가 좋은데, 단순한 각 덧셈이 아니라 내부적으로 Quaternion(쿼터니언) 연산을 통해 회전이 합성되기 때문이다

  • 쿼터니언 계산이므로, 회전 순서, 회전축 회전에 의한 오류를 잡아주어 Rotator 계산에 좋다

Relative~~

  • 블루프린트에서 Get(Set) Relative Location(Rotation) 함수들이 존재하는데 이 함수를 통해 아까 말했던 각 컴포넌트들의 transform을 설정해줄 수 있다

회전문 개선


Physics

  • 물리효과를 적용시킬 수 있게 해주는 항목

  • Linear Damping: 숫자가 높을수록 잘 미끄러짐

  • Angular Damping: 숫자가 높을수록 잘 회전함

Random Timer

  • Random Float in Range를 통해 0초부터 5초 사이의 랜덤한 숫자를 반환
  • Set Timer by Event는 해당 시간에 특정 Event를 발생
  • Set Timer by Function Name은 해당 시간에 특정 함수를 호출

랜덤한 주기로 튀어오르는 아이템 만들기

  • 타이머를 이용하여 만들어보았으나, 아이템의 위치가 바뀌지 않았음
  • Physics가 적용되고 있는 물체의 경우 해당 물체의 회전, 이동은 물리엔진이 직접 관리하기 때문에 Set Actor Location이 작동하지 않는 것이었다
  • 따라서 물리엔진에 관리를 받는 물체에는 AddImpulse, AddForce 등을 사용해야 한다

  • 물리적용을 받는 컴포넌트의 경우 Add Impulse를 사용하므로 target도 컴포넌트를 연결해야 함
  • Self로 냅두면 컴파일 에러가 발생

profile
반갑습니다

0개의 댓글