더블 위시본 서스펜션 비히클 만드는 법

언리얼 엔진 4 에서 더블 위시본 서스펜션 차량을 구성하는 방법에 대한 설명입니다.

Windows
MacOS
Linux

들어가기에 앞서

이 프로젝트와 튜토리얼은 커뮤니티의 일원이신 Xenome 님께서 제공해 주셨습니다.

고맙습니다!


이 튜토리얼은 고급 비히클 템플릿의 디테일한 부분에 대한 길잡이입니다. 마치고 나면 그 이론적인 작동법에 대해 꽤나 잘 이해할 수 있을 것이며, 무언가를 직접 만드는 법에 대해서도 알 수 있을 것입니다. 여기서 주요 초점으로 삼을 것은, 서스펜션입니다.

이 비히클 템플릿에 사용된 모든 FBX 애셋은 여기서 다운로드 가능합니다. FBX 파일을 읽고 쓸 수 있는 모델링 프로그램에서 원본을 분석하고 직접 여러분의 디자인을 실험해 볼 수 있을 것입니다.

시작하기 전, 더블 위시본 서스펜션은 표준 언리얼 엔진 4 비히클보다 구성하기가 꽤나 까다롭다는 점을 알아두셔야 합니다. 그러므로 기존에 표준 비히클을 구성해 본 적이 없다면, 그것부터 먼저 해 보시길 강력 추천합니다. 에픽의 유튜브 페이지에 표준 절차를 안내해 드리는 비디오가 있으니, 먼저 확인해 보시기 바랍니다. UE4 의 비히클 소개

이 비디오를 시청하신 이후에는, 기본 비히클을 무리 없이 만드실 수 있을 것이며, 여기서 논하는 더블 위시본 디자인을 살펴보실 준비가 되셨을 것입니다. 몇 가지 기본적인 이론으로 시작하도록 하겠습니다.

시뮬레이티드 휠 대 실제 서스펜션 연결장치

비히클 무브먼트 컴포넌트를 구성하여 휠을 할당할 때, 휠의 세로 운동은 전형적으로 비히클의 애니메이션 블루프린트 안의 WheelHandler 노드를 통해 업데이트합니다. 각 프레임에서, 이 핸들러는 휠을 로컬 Z 축으로 이동시켜 상하 운동을 시뮬레이션해 내어, 휠이 가급적 바닥에 닿도록 하고 있습니다.

여기에 추가적으로 WheelHandler 는 휠이 Y 축 스핀하도록 만들기 위해 로테이션을 적용하기도 하는데, 이는 시뮬레이션 모터와 기어박스의 회전 속력으로 구동시켜 줍니다. 여기에 추가로 휠을 Z 축을 중심으로 회전시키는데, 이는 현재 스티어링 각도로 구동시켜 줍니다.

서스펜션의 세로 운동량 기본값은 VehicleWheel 파생 클래스의 Suspension Max Raise and Drop 세팅으로 제한됩니다. 이 운동은 전적으로 선형이며, 아래와 같습니다:

simwheeldefaultmovement.gif

WheelHandler 에 의해 계산되는 표준 세로 운동입니다.

이러한 유형의 서스펜션 시뮬레이션은 완전히 현실적이지는 않지만, 사실상 대부분의 비히클에는 거의 완벽히 들어맞습니다. 보통 서스펜션 암이나 스프링 또는 샥 같은 기타 부품을 볼 수는 없기 때문입니다. 차체가 완전히 덮여있는 모델이라면 이러한 방식으로 충분히 통합니다.

하지만 사막용 버기 또는 포뮬러 1 같은 개방형 비히클의 경우 이동 부속이 육안으로 확인되기 때문에, 이러한 운동을 실제로 만들어낼 수 있는 실제 서스펜션 디자인이 없어서 문제가 될 수 있습니다.

좀 더 현실적은 결과를 얻기 위해서는, 비히클 차체에 고정된 중심축을 기준으로 회전하는 것처럼 표현 가능한 유형의 진짜 모션이 필요합니다:

realwheelmovement.gif

이상적인 상하 좌우 운동입니다.

이러한 작은 난제 해결을 위해, 휠 관리가 두 가지 다른 범주에 해당한다 가정하는 것으로 시작할 수 있겠습니다: 하나는 시뮬레이티드 휠 노드가 WheelHandler 에 의해 제어된다, 다른 하나는 실제 볼 수 있는 휠이 차를 운전할 때 렌더링된다는 점입니다. 그러면 WheelHandler 에 의해 우리에게 제공된 데이터를 나머지 서스펜션 셋업에 물려주어 원하는 결과를 낼 수 있을 것입니다.

요약하면, 보이는 휠과 시뮬레이티드 휠은 사실상 완전히 다른 두 개의 오브젝트가 되어, 시뮬레이티드 휠은 전혀 보일 필요조차 없을 거라는 점입니다.

VehicleWheel 클래스에서 우리가 정의하는 휠 파라미터는 콜리전 메시, 반경, 폭을 명시적으로 정의할 수 있습니다. 그 사양이 비히클의 스켈레탈 메시에 있는 실제 지오메트리에 반드시 해당할 필요는 없으므로, 메시의 시뮬레이티드 휠 노드에 실제 지오메트리를 붙일 필요도 전혀 없습니다. 게다가 비히클 블루프린트의 휠 셋업 섹션에 추가적인 휠 오프셋을 지정하여, 휠의 중심축을 보이는 휠 메시의 기하학적 중심에 맞출 필요도 없습니다.

기술적인 관점에서 사실감있게 잘 돌아가는 것처럼 보이는 서스펜션을 만드는 데 필요한 기본적인 이해는 이와 같습니다.

스켈레탈 노드가 할 수 있는 일

계속하기 전, 우리 구성에 특히나 유용하게 쓰일 애니메이션 블루프린트 노드 두 가지를 살펴볼 필요가 있습니다. WheelHandler 노드는 이미 다뤘지만, 이러한 유형의 리깅에 정말 중요한 강력한 도구가 더 있는데, 바로 CopyBoneLookAt 노드입니다. 둘 다 애니메이션 블루프린트 에디터의 Skeletal Control 카테고리에서 찾을 수 있으며, Maya 같은 어플리케이션에서 표준 위치, 회전, 조준 컨스트레인트가 전형적으로 하는 작업과 똑같은 작업을 거의 비슷하게 해 냅니다.

Copy Bone

이름에서 알 수 있듯이, CopyBone 노드는 하나의 (소스) 본에서 다른 (타깃) 본으로 트랜스폼 데이터를 복사할 수 있습니다:

node_copybone.png

CopyBone 애니메이션 블루프린트 노드와 그 기본 세팅입니다.

WheelHandler 가 시뮬레이티드 휠의 트랜스폼 정보를 업데이트하고 나면, 거기서 회전 값만을 구해 보이는 휠에 적용하는 것이 가능하다는 뜻입니다. 이와 같은 기본적인 방법으로 우리가 원하는 휠의 스핀 및 스티어링을 처리하면서도, 필요치 않은 이동 (위치) 데이터를 구하지는 않아도 됩니다.

Look At

LookAt 노드는 카디널 축 중 하나가 다른 본을 조준하는 식으로 주어진 본을 회전시킬 수 있습니다:

node_lookat.png

LookAt 애니메이션 블루프린트 노드와 그 기본 세팅입니다.

우리 구성상 유용하게 쓰이는데, 시뮬레이티드 휠의 현재 위치를 직간접적으로 구동하는 것만으로 서스펜션 메커니즘의 모든 성분이 계속해서 옳은 방향을 가리키도록 업데이트할 수 있는 방편을 마련해 주기 때문입니다. 우리가 해 줄 일은, LookAt 노드가 조준할 수 있는 본이 있는지만 확인해 주면 됩니다. 애니메이션 블루프린트의 여러 본에 사용됩니다.

구현 개요

요약: 네 휠 각각에 대해 WheelHandler 가 관리할 보이지 않는 휠을 하나 사용하며, 게임에 실제 렌더링되는 보이는 휠을 하나 사용합니다. 전자는 그저 단일 본/조인트로, 웨이팅되는 메시 부분은 없는 반면, 후자는 모델링 패키지에서 만들어 비히클 모델에 추가한 다음 최종 구성에 UE4 로 임포트한 바퀴같은 메시입니다.

모든 것이 의도한 대로 작동하도록 하기 위하여, 서스펜션의 핵심 부분은 다른 본에서 필요한 트랜스폼 데이터를 복사하거나, 모델에 구성해 둔 타깃을 바라보는 것으로 방향을 조절합니다.

모델 조성하기

이제 이론에서 벗어나, 데모 비히클 조성 방식을 살펴볼 차례입니다. 주로 쓰시는 모델링 어플리케이션에서 Assets/FBX/vehicle_proto_S2.9.fbx 파일을 열어보시면, 따라하면서 어떻게 들어맞나 확인해 보실 수 있습니다.

이 튜토리얼용으로 만든 비히클 프로토타입에는 이런 식으로 디자인된 서스펜션 릭이 있습니다:

keycomponents.png

프로토타입 비히클의 정면 우측 서스펜션을 확대해 본 모습입니다. 추가된 색은 이해를 돕기 위해 추가한 것일 뿐, FBX 파일의 머티리얼에 속한 부분은 아닙니다.

여기서 핵심 성분은 (노랑) 위 아래 팔 부분, (빨강) 킹핀, (파랑) 허브입니다. 양 팔은 그림 저 오른쪽에 보이는 각자의 육각 볼트를 중심으로 회전합니다.

모든 것이 모이는 가장 중심점은 아래 팔의 초록 볼트에 가깝습니다. 그 부분이 시뮬레이티드 휠 조인트로, PhysWheel_[loc] 가 처음에 위치한 곳입니다. 킹핀과 허브, 그리고 보이는 휠 역시도 정확히 같은 그 위치에 중심축이 있습니다.

이 성분 각각에는 매우 엄격하게 담당하는 부분과 트랜스폼 범위가 있습니다. 팔은 전방 축을 기준으로만 회전합니다. 킹핀은 아래 팔 끝부분 위치를 따르지만, 항상 수직 위치를 유지하며 절대로 비히클을 기준으로 회전하지 않습니다. 허브는 스티어링에 반응해서 세로축으로만 회전합니다. 보이는 휠은 시뮬레이티드 휠에서 로테이션을 복사해 오지만, 그 위치는 아래 팔의 끝부분에서 받아옵니다. 이렇게 하여 모든 것을 단단히 고정시킵니다.

일정 수준 복잡한 릭이라면, 계층구조를 유지하며 순서 업데이트를 염두에 두는 것이 매우 중요합니다. 특히 이 경우에, 아래 팔이 회전하면 반드시 그에 따라 킹핀이 CopyBone 노드를 사용하여 올바른 위치를 유지하기 위해 필요한 자손 메시(아래 초록 볼트)가 따라붙어야 합니다. 그러면 윗팔은 차례로, LookAt 노드를 사용하여 조준할 무언가를 갖기 위해서 킹핀의 (위쪽 초록 볼트 근처) 자손 메시의 업데이트된 위치에 접근할 필요가 있는 식으로 이어집니다. 아시겠지만 여러가지 성분이 올바른 순서대로 업데이트되도록 하는 것이 중요한데, 그렇게 되지 않으면 서스펜션 일부가 다른 부분의 움직임에 뒤쳐져 보일 수가 있습니다.

이 모든 프레임 단위 업데이트는 애니메이션 블루프린트가 처리합니다.

DCC (디지털 콘텐츠 제작) 어플리케이션에서 모델을 제작할 때 걱정해야 할 것은 정말이지 계층구조와 컴포넌트 피벗의 정확한 위치 및 방향입니다. LookAt 노드로 로테이션이 업데이트되는 컴포넌트에 대해서는, 적당한 방향이 특히나 중요합니다.

참고로, 이러한 유형의 메커니즘을 디자인할 때는 모델링 패키지에 제공되는 컨스트레인트를 사용하면 도움이 될 수 있습니다. 임포트시 FBX 를 따라 UE4 에 들어오지는 않지만, 가끔은 모델을 만드는 도중 약간의 기본적인 움직임을 위해 무엇이 필요한지 파악하기가 쉬워집니다. 각기 다른 성분이 서로 교차하지 않고 필요한 대로 움직이도록 하기 위해서지요. 하지만 애니메이션 블루프린트 안에서 재현 불가능한 컨스트레인트 사용은 피하시기 바랍니다.

언리얼 엔진 4 에서의 구성

이제 언리얼 엔진 안에서 이 데모가 어떻게 구성되었는지 살펴봅시다. 에디터에서 따라할 프로젝트 파일을 로드한 다음, 비히클의 애니메이션 블루프린트를 엽니다. 참고로 대부분의 작업은 각 휠당 한 번씩, 네 번 적용되어 있습니다.

비히클 운전 도중 애니메이션 블루프린트에서는 다음과 같은 일들이 벌어집니다:

먼저 WheelHandler 가 시뮬레이티드 휠 (PhysWheel 본)의 위치와 회전을 업데이트합니다. 그러면 보이는 휠 (VisWheel 본)이 PhysWheels 에서 로테이션을 복사하여 업데이트합니다:

animBP_1.png

WheelHandler 에 이어 보이는 휠에 Copy Rotation 이 이어집니다.

이렇게 하여 시각적으로 옳은 스핀과 스티어링이 나오지만, 휠은 위치가 변하지 않습니다. 나중에 별도로 처리할 부분이구요.

다음으로, 아랫팔(ArmLower 본)은 PhysWheel 위치를 조준합니다. 비히클 오른편의 팔은 바라보는 축으로 Y 를 사용하는 반면, 왼쪽의 팔은 음수 Y 를 사용합니다:

animBP_2.png

ArmLower 본이 PhysWheel 위치를 바라보고 있습니다.

LookAt 노드의 결과는 애니메이션 블루프린트 에디터의 3D 창에서 쉽게 미리볼 수 있습니다. 선택된 LookAt 노드의 현재 타깃은 빨강 십자선으로 마킹됩니다. 프리뷰 뷰포트를 와이어프레임 모드로 설정했다면 더 잘 보입니다.

ArmLower 본이 LookAt 대상에 일치시키기 위해 회전할 때, POS_Hub 라는 자손 컴포넌트를 끌어옵니다. 다음 단계에서 CopyBone 을 사용하여 POS_Hub 본의 트랜슬레이션만 구하는 식으로 Kingpin 의 올바른 위치를 잡는 데 사용됩니다:

animBP_3.png

킹핀 위치를 설정합니다.

Hub 와 VisWheel 는 나중에 같은 메서드를 사용하여 같은 위치로 설정됩니다.

다음 단계에서는 윗팔 (ArmUpper 본)들을 각자의 타깃 (LAT_ArmUp 본)을 바라보도록 하여 업데이트하는데, 이 타깃은 이전 단계에서 업데이트된 Kingpin 본의 자손이기 때문에 이미 위치가 올바르게 잡혀있습니다:

animBP_4.png

윗팔 방향을 잡습니다.

허브 위치를 설정한 이후에는, 전방 허브에만 해줘야 하는 추가 작업이 있는데, 스티어링으로 인해 발생한 Z 축 회전을 반영하는 것입니다. 이는 전방 PhysWheels 의 자손인 LAT_Hub 본을 타깃으로 하는 LookAt 노드로 처리됩니다:

animBP_5.png

허브 위치와 스티어링 각도를 설정합니다.

마지막으로 VisWheel 위치가 POS_Hub 본에 일치하도록 설정한 이후, 샥의 윗부분이 하부 샥마운트 (ShockMount_Low) 를 조준하도록, 그리고 하부 샥 본이 윗팔의 자손인 바로 그 샥마운트 위치를 따르도록 합니다:

animBP_6.png

보이는 휠의 위치를 잡고, 샥 컴포넌트를 조절합니다.

PhAT

프로토타입의 피직스 애셋 구성은 표준 비히클 템플릿과 대체적으로 비슷하지만 약간의 예외는 있습니다. 가장 명확한 차이점이라면 안테나를 이루는 다수의 작은 구체형 바디이며, 보다 중요한 부분은 주요 비히클 프레임을 둘러싼 커스텀 콜리전 모양입니다.

phat_1.png

PhAT 에서 본 콜리전 바디입니다.

이 모델의 루트 컴포넌트는 사실상 조인트이므로, 세밀한 콜리전 볼륨을 만들어내는 데 사용할 수 있는 지오메트리가 없습니다. 메인 바디 볼륨은 UCX 메시로 장착된 별도의 스태틱 메시를 임포트하여 만든 것입니다 (Assets/FBX/vehicle_collision_S2.9.fbx).

phat_2.png

콜리전 포함해서 별도로 임포트한 스태틱 메시 애셋입니다.

이 전체를 PhAT 에서만 처리할 수는 없습니다. 첫 단계는 쓰시는 3D 모델링 패키지에서 콜리전 애셋을 만드는 것인데, 가급적 메인 바디 메시 자체부터 시작하는 것이 좋습니다. 그런 다음 이 콜리전 모델을 표준 스태틱 메시로 UE4 에 임포트하면서, UCX 콜리전도 같이 가져옵니다. 그 작업이 완료되면, PhAT 안에서 단순히 이 콜리전 데이터를 비히클의 루트 노드로 복사하기만 하면 됩니다. 이 옵션은 PhAT 의 계층구조 패널에서 기존 바디에 우클릭 하여 사용할 수 있습니다. 타깃 본에 이미 할당된 바디가 없는 경우, 먼저 스필(캡슐)같은 것을 추가한 다음 그것을 사용하면 됩니다. 그런 다음 커스텀 콜리전 추가 후 스필을 제거합니다.

phat_3.png

메뉴 제일 하단 "Advanced" 아래 있는 콜리전 복사 옵션입니다.

안테나 셋업

안테나가 더블 위시본 서스펜션 셋업의 일부는 아니지만, 비히클의 전체적인 처리에 영향을 끼칠 수는 있습니다. 가장 단순한 솔루션은 물론 물리 영향을 받지 않는 완벽히 고정된 안테나이지만, 여기서는 비히클의 운동에 악영향을 끼치지 않으면서 움직이는 안테나를 구성하는 방법을 보여드립니다.

이 템플릿의 Antenna1 부터 시작해서 끝의 Antenna10 에 이르는 각 본은 구체형 바디를 포함해서 구성되어 있으며, 그 반경은 안테나 메시 자체의 반경에 일치합니다. 바디에는 Enable Gravity (중력 활성화) 옵션을 꺼서 안테나가 물리 시스템에서 최소한의 노력으로 직립 상태를 유지할 수 있도록 했습니다. 이 바디의 질량은 제일 아래의 질량 스케일이 16 으로 시작해서 끝부분으로 갈 수록 기하급수적으로 줄어듭니다. 다음 바디의 질량 스케일은 이전 바디의 50% 로 설정하여, 제일 아래부터 끝부분까지의 값은 16, 8, 4, 2, 1, 0.5, 0.25, 0.12, 0.06, 0.03 식이 됩니다. 이렇게 하여 바탕은 무겁되 끝부분은 깃털처럼 가벼우면서, 두 극단 사이에 부드러운 전환이 생깁니다.

phat_antenna_1.png

이 바디에 적용된 컨스트레인트는 선형과 각형 모두 완전히 고정되어 있습니다. 본 체인이 비교적 긴 편이므로, 방향이 살짝만 변해도 가속도에 반응하여 일어날 것이라, 위에 언급한 매스 스케일 세팅과 같이 하여 적당히 부드러운 진동과 함께 안정적인 시뮬레이션을 얻을 수 있습니다.

극심한 가속도에서 시뮬레이션이 폭발적으로 일어나지 않도록 하기 위해, 모든 안테나 컨스트레인트에는 projection 옵션을 켜고 angular tolerance 를 1.0 으로 한 뒤, 바디에 대한 Position Solver Iteration Count 를 16 으로 올렸습니다.

phat_antenna_2.png

마지막으로 안테나 바디 사이 뿐만 아니라 비히클의 나머지 바디 사이의 내부 콜리전 모두 꺼서 불필요한 내부 충돌을 방지했습니다. 이 작업을 쉽게 하기 위해서는, 계층구조 패널에서 바디와 함께 모든 본을 선택한 다음 메인 PhAT 툴바의 콜리전 끔 버튼을 클릭하기만 하면 됩니다.

phat_antenna_3.png

직접 굴려보기

이제 이 구성 작동방식을 알았으니, 이 프로토타입 대신 여러분만의 모델을 만들기 시작해 보고 싶으실 것입니다. 골치아플 일을 최소한으로 줄이는 데 도움이 될만한 몇 가지 사항은 아래와 같습니다.

첫 번째, 이름과 계층구조를 프로토타입과 가급적 유사하게 유지하는 것입니다. 그렇게 하면 애니메이션 블루프린트에 별다른 수정 없이도 다른 스켈레탈 메시에 다시 할당하여 사용할 수 있습니다. 시간이 많이 절약될 것입니다. 모든 메시 역시 리모델링하여 다른 위치로 이동시킬 수 있습니다. 그저 모든 것이 제대로 정렬되었는지만 확인하면 됩니다. 모델에 메시 노드를 추가하는 것은, 전체적인 계층구조상 핵심 서스펜션 요소에 방해되지 않는 한 문제가 되지 않습니다.

비히클 루트는 글로벌 스페이스의 0,0,0 위치에 있어야 하며, 어떤 식으로든 회전시켜서는 안됩니다. 루트를 심플 조인트 오브젝트로 만들면 FBX 익스포트 / 임포트시 별다른 문제가 없을 것이며, 특히나 쇼크 메시 변형처럼 부드러운 바운드 성분 사용시에는 더욱 그렇습니다.

쓰시는 모델링 패키지에서 지원한다면 Z 를 윗축으로 설정해서 사용하세요. 어떤 경우든 Y 축을 앞으로 인식하는 어플리케이션에서도 X 축이 앞을 가정하도록 하세요.

휠 메시는 모델링 어플리케이션에서 바닥/그리드에 접해야 합니다. 항상 모델 개별 컴포넌트의 피벗 위치가 의도된 회전 중심에 있도록, 그리고 그 로테이션이 0 인지 확인하세요. 명확한 예외라면 샥의 경우인데, 루트와 팁 조인트 방향이 서로를 향하도록 하는 것이 이치에 맞습니다. 확실히 알고 있는 경우가 아니라면 1,1,1 이외의 스케일은 절대로 사용하지 마시고, 트랜스폼을 얼리거나 비슷한 기능을 하는 것은 피하시기 바랍니다.

임포트 옵션

다음 임포트 세팅은 프로토타입에 사용된 것인데, 직접 제작하신 모델을 임포트할 때도 참고삼기에 괜찮을 것입니다:

import_options.png

프로토타입 비히클에 사용된 임포트 옵션입니다.

...이정도면, 고급 비히클을 자체 제작하는 데 필요한 개념이 충분히 잡히셨을 줄로 믿습니다. 행운을 빕니다!

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼