닫기버튼


상단 배너 영역


취재

[NDC 25] 저 메시의 목을 쳐라! 넥슨 팀 컴플루언스 전수현 프로그래머의 절단신공

페이스북 트위터 기사제보

 
 
넥슨이 주최하는 국내 최대 규모의 게임 개발자 콘퍼런스, '넥슨 개발자 콘퍼런스(이하 NDC)'가 6월 24일부터 26일까지 사흘간 판교 넥슨 사옥과 경기창조경제혁신센터에서 진행된다. IP 확장과 기획·개발 노하우, 생성형 AI와 데이터 분석 등 게임 산업의 최신 트렌드를 화두로, 총 10개 분야, 49개 세션이 준비됐다.
 
여러 게임, 특히, 사실적 액션이나 극적인 액션을 유발하기 위한 게임에서 타격감, 혹은 액션성 강화를 위해 캐릭터의 신체 일부를 파괴하는 기능을 사용하고 있다. 소위 우수수 썰려 나가는 것을 보며 다소 잔인하면서도 쾌감을 느낄 수 있는 그 행위 자체의 이면에는 어떤 기술적인 고민이 있을까? 그에 대한 해답을 찾아가는 이, 넥슨코리아 개발관리그룹 엔진실 게임엔진팀 전수현 엔진프로그래머가 자신의 사례를 공유했다.
 
 
그는 먼저 엔진실 게임엔진팀은 워헤이븐 엔진파트에서 시작한 팀으로 프로그래머와 TA로 구성된 공용 조직으로서 최근 낙원, 빈딕투스 같은 신작 뿐 아니라 마비노기, 마영전 같은 라이브 게임 등 넥슨 내 다양한 프로젝트에 기술 지원을 하고 있다고 소개했다. 
 
그는 과거 워헤이븐 때는 캐릭터를 돌로 만들어 절단하는 방식을 사용했다고 소개했다. 이는 이미 많은 게임에서 사용하는 방식이며, UE 플러그인으로 만들어 폭넓게 활용할 수 있겠다고 생각, 하지만 일반적인 사용을 위해 말랑말랑한 랙돌 상태 유지하면서 절단할 수 있게끔 하고자 했으며 결론적으로는 아직 개발 중에 있는 기능이지만 자신이 고민하고 해결 안을 찾은 경험을 공유하고자 했다고 강연의 목적을 밝혔다.
 
그의 첫 목표는 실시간 절단에서 빼놓을 수 없는 타이틀 2013년 작, '메탈 기어 라이징'이었다. 이에 대한 레퍼런스가 된 작품은 2024년 언리얼 페스트에서 만나게 된 스텔라 블레이드였다. 상당히 효율적인 구현이 인상적이었다고.
 
 
이어서 그는 절단 구현을 위해 언리얼 엔진이 제공하는 ProceduralMesh와 BreakConstranint() 기능에 대한 설명, 그리고 실제 이 두 가지 기능을 이용해 절단 구현을 하기 위해 필요한 추가적인 작업 방식에 대해 나열했다. 
 
절단 구현을 위해 언리얼 엔진이 제공하는 기능은 첫번째는 프로시저럴 메시다.

일반적인 스태틱 메시나 스켈레톤 메시는 이미 모델링된 정보를 가져와서 화면에 그려주는 역할을 하는데, 이 기능은 그것과는 조금 다르게 실시간으로 삼각형을 넣거나 빼거나 하는 것이 가능하다. 거기에 평면을 주면 평면을 기준으로 잘라주는 기능 구현이 가능하다. 하지만 이 기능은 스태틱한 메시이므로 딱딱한 돌 형태로만 절단이 가능하다는 단점이 있었다.
 
다음은 BreakConstranint() 이다. 스켈레탈 메시를 가지고 와서 본 사이에 연결을 끊고 절단을 만들어준다. 기본적으로는 스켈레탈 메시이므로 애니메이션이 문제없이 잘 적용되며 메시를 조건에만 맞춰 만들면 절단을 표현할 수 있다. 다만, 그런 것을 고려하지 않고 만든 스켈레탈 메시를 자르면 죽 늘어나 보이게 된다.
 
메시가 늘어나는 이유는 간단하다. 2개의 본에 영향을 받는 메시가 있다고 가정 하고 이를 끊었을 때 각각의 본을 추적해 2개의 매핑이 생기게 된다. 그리고 실제 렌더링할 때는 이 2개를 렌더링해서 아무것도 없는 허공에 있는 점을 렌더링에 사용하게 된다. 이 과정을 메시 전체에 적용하게 되면 떨어져 나간 부분과 블렌딩 하는 과정에서 늘어지게 되고 마는 것..
 
일반적인 절단을 위해서는 BreakConstranint()를 사용할 본을 선택하고, 메시에서 선택한 본에 영향 받는 범위를 가져 와서 프로시저널 메시로 복사한다. 이 복사한 메시를 절단하는 것. 이렇게 절단한 메시는 놔두고 스켈레탈 메시를 가져와 BreakConstranint()를 이용해 끊어준다. 앞서 이미 늘어난 범위가 어디인지 알았으니 이를 버텍스 컬러를 이용해 마스킹해 지워준다. 
 
 
이는 실제로 스켈레탈 메시를 자른 것은 아니지만 잘라져 보이도록 만들 수 있다. 물론 절단 작업은 이것으로 끝난 것은 아니다. 이후 절단된 본 외에도 그 외에 영향 받는 본이 찢어지는 현상을 수정하기 위해 각 경계를 맞추기 위해 붙여 놓은 메시에도 애니메이션을 적용하기 위해 프로시저럴 메시에는  없는 스키닝 애니메이션을 구현하기 위해 손으로 직접 매 틱마다 버텍스 업데이트를 통해 구현하는 프로시저럴 메시 스키닝 작업까지 차례로 소개했다. 실제 적용 공식을 소개하기도.
 
이 복잡한 과정에서도 본 하나만 가져 와서 절단 하는 지금의 방식으로는 본 여러 개가 겹쳐 있는 범위, 즉, 세로 방향으로 자르는 것은 불가능했으므로 이를 해결하기 위한 과정도 소개했다.
 
첫 번째 그냥 통으로 잘랐을 때는 잘리긴 잘리지만 잘리는 애니메이션이 깔끔하지도 않고, 잘려진 부위기 엉망진창으로 쏟아져 버리게 된다. 이는 절단을 하고 합치다 보니 잘려진 조각들이 제대로 합쳐지지 않는 것. 해결을 위해 자르고 합치는 것이 아니라 애초에 합치고서 자르는 방식을 택했다. 
 
 
또, 이때 사람이 생각하는 절단 값과 컴퓨터가 생각하는 절단 값의 차이에서 발생하는 메시 아일랜드 문제가 발생했다. 
 
앞서 이미 절단을 구현한 워헤이븐에서는 아일랜드가 될 가능성이 있는 사지 부분을 마킹하여 전달 후 마킹한 값을 참고해서 분리하는 식의 구현을 했지만 이 경우 그가 원하는 연속적인 절단에 구현하기는 쉽지 않았다.
 
그는 고민 끝에 Lattice Deformer 기능을 찾았다. 메시를 3D 격자에 매핑시켜서 변형시키는 기능으로, 메시를 3D 격자로 나누고, 각 셀 간의 연결 정보를 저장해 토폴로지 맵을 구성했다. 이후 메시 절단 시 토폴로지 맵도 같이 절단하도록 하여 절단된 토폴로지 맵을 기반으로 아일랜드를 탐색하게 했으며, 의도대로 작동하게 됐음을 확인했다. 
 
 
메시를 자연스럽게 절단하는 것에는 성공했으나 이후는 자연스러운 애니메이션 구현을 위한 고민이었다. 그는 왜 굳이 메시를 본에 붙여야만 하는가? 에 대한 근본적인 질문을 하게 됐다고. 결론적으로 잘라진 메시의 절단면의 버텍스가 스키닝 웨이트가 없기 때문에 애니메이션을 할 수 없으니 본이 따라 움직였어야 하는 것. 그렇다면 애초에 스키닝 웨이트가 있으면 본에 붙이지 않아도 된다는 얘기이며, 본 하나만 따라서 움직일 거라면 웨이트만으로도 쉽게 표현할 수 있을 거라고 생각했다. 
 
즉, 메시를 본에 직접 붙이는 대신 스키닝으로 해결하고, 메시를 나눠 본 단위로 관리하는 대신 통 메시에서 버텍스 단위로 관리할 수 있을 거란 아이디어까지 도출해낸 상태라고 전했다. 그는 아직 완성 단계는 아니지만 실제 절단이 되는 수준에는 이르렀으며 아직 디벨롭 단계라고 밝혔다.
 
그는 또 다른 절단의 여정을 소개했다.
 
 
넥슨 사내에서 그의 절단 기술을 눈여겨 본 '낙원' 팀의 요청을 받았던 것. 하지만 낙원에서 잘라야 할 대상은 좀비, 즉, 너무 칼로 자른 것처럼 날카롭기만 해서 좀비의 신체에는 어울리지 않았다.
 
즉, 그에게 주어진 숙제는 깔끔한 절단 면이 아닌 찢기고, 둔기에 의해 손상된 텍스처의 절단 면이 필요했다. 이는 파괴 부위를 정해놓고 미리 만들어진 메시로 교체하는 것이 일반적인데 이는, 그가 지금까지 목표로 했던 메탈 기어 라이징 절단 연구와는 다른 방향이었다.
 
그는 데드 아일랜드 2에서 힌트를 찾았다. 데드 아일랜드는 메시 2개를 겹쳐놓고 교차 출력하고, 데칼을 이용해 블렌딩을 하는 방식을 채택하고 있었다.
 
 
그는 레프트 4 데드에서 활용한 메시 클리핑 방식을 응용해 데칼 및 디폼으로 의상의 손상, 피부가 파이는 등의 상처 표현 방식을 찾을 수 있었다. 또, 이 방식은 레퍼런스 포즈 공간에서 계산을 수행하므로 절단 및 애니메이션과 독립적으로 구현할 수 있다. 절단 후 붙이는 프로시저럴 메시에도 동일한 방법을 적용할 수 있다. 절단 면을 구성하는 버텍스 역시 단순 좌표 값이라 쉽게 계산 가능했다고.
 
이를 통해 데미지 타입에 따라 날카로운 절단과 둔기로 때렸을 때 상처 표현을 동반한 절단을 선택할 수 있게 됐다.
 
다음 숙제는 절단면 고도화 작업이었다.
 
그는 크라이 엔진에서 나무 파괴를 위한 기능 Boolean Destructible에 집중했다. 메시를 뺴서 절단을 수행하도록 하는 기능이었다. 이 같은 메시 불린은 맥스나 마야 같은 모델링 툴에서 흔히 볼 수 있는 기능으로 이 같은 기능은 언리얼 엔진에도 내장된 기능이기도 했는데 단, 이를 사용하기 위해서는 기존의 프로시저럴 메시가 아닌 FDynamicMesh 3가 필요했다.
 
FDynamicMesh 3는 편집용 기능으로 프로시저럴 메시처럼 삼각형을 넣고 빼는 것은 기본이고, 근접한 삼각형을 찾아주거나, 쪼개주는 기능부터 앞서 메시 불린 기능까지 지원한다. 이후 직접 프로시저럴 메시에서 사용할 수 있도록 변환하자 울퉁불퉁한 모양으로 절단이 가능해졌다.
 
단, 앞서 소개한 것처럼 절단 자체가 완전히 완성된 버전이 아니다 보니 아무 방향으로나 마구잡이도 자를 수는 없었다. 즉, 절단 위치나 각도에 제약이 발생, 즉, 좋지 않는 각도가 입력되면 예쁘게 잘릴 수 있는 각도로의 보정이 필요했던 것.
 
이를 위해서는 절단을 위해 복사한 메시에는 원본 메시에 연결되는 경계 부분이 존재한다. 절단면이 이 부분을 건들면 실패다. 그는 먼저 예쁘게 잘릴 수 있는 각도를 찾기 위해 1차로는 잘리는 면을 이동시키고, 이동시켰을 때 반대편에 걸리게 되면 아예 안전한 각도를 찾도록 접근했다.
 
 
이를 위해서는 양쪽 경계를 컨벡스 볼륨으로 감싸고 이 둘 사이의 충돌을 검사, 충돌이 있다면 예쁘게 자를 수 있는 각도가 없는 것이고, 충돌이 없다면 가장 가까운 위치를 가로지르는 평면을 사용하게끔 했다. 이를 통해 어색하게 잘리는 문제를 상당 부분 해결했다.
사실 이 밖에도 다양한 문제들이 발생했지만 그의 연구는 이 같은 문제들을 하나하나 해결하는 시간의 연속이었다고.
 
강연의 앞에 말한 것처럼 그의 절단 연구는 아직 미완성이며 끝나지 않았다.
 
그는 향후 자신의 계획을 밝히는 것으로 강연의 마지막을 채웠다. 먼저 자유로운 절단을 향해 현재 방식에서는 한계가 있다는 것을 알게 됐으며 지금까지 배우고 얻은 아이디어를 통해 부위별로 절단 후 관리하는 대신 스켈레탈 메시 하나를 다이나믹 메시로 관리하는 방식을 고려하고 있다고 전했다. 경우에 따라서는 추가적인 본이나 스켈레탈 메시를 스폰하는 방식도 혼합하는 것도 생각하고 있다고.
 
프로시저럴 메시는 스켈레탈 메시와 하드하게 연결돼 있으면서도 정작 지원하는 건 사실상 렌더링 뿐으로, 매핑 데이터를 따로 관리해야하고, 이 탓에 새로운 시도를 할 때마다 복잡도가 증가할 수밖에 없다. 정합성 관리 비용이 증가하는 것도 문제다. 하지만 다이나믹 메시는 편집 기능 외에도 여러 프로퍼티를 저장하고 관리해주는 기능도 제공하므로 기존의 프로시저럴 메시를 다이나믹 메시로 변경하는 작업을 진행할 계획이다.
 
그는 아직 완성된 기능은 아니지만 강연에 나선 이유는 본인이 다른 분들의 발표를 찾아보면서 도움을 받아왔으므로 자신처럼 같은 고민을 하는 분들께 도움이 되고자 했다고 전했다. 또, 그가 속한 팀 컨플루언스는 내부 채용, 외부 채용을 진행 중이므로 엔진 프로그래밍에 관심 있는 분들의 지원을 바란다고도 덧붙였다.
 

김규리 기자의

ⓒ기사의 저작권은 게임조선에 있습니다. 허락없이 무단으로 기사 내용 전제 및 다운로드 링크배포를 금지합니다.

최신 기사

주간 인기 기사

게임조선 회원님의 의견 (총 0개) ※ 새로고침은 5초에 한번씩 실행 됩니다.

새로고침

0/500자

목록 위로 로그인


게임조선 소개및 약관