본문 바로가기

레퍼런스/고도엔진

고도엔진 튜토리얼 #24 3D로의 초입(Introduction to 3D)

3D 게임을 만드는 것은 어려운 일입니다. 추가적인 Z 축은 간단한 2D 게임의 보통의 기술이 그렇게 도움이 되지 안습니다. 이 이동을 돕기 위해, 2D와 3D의 API가 매우 비슷하다는 것을 언급하는 것이 좋겠군요. 대부분의 노드는 2D와 3D 버전에서 같이 제공됩니다. 사실, 2D에서 해당하는 것과 똑같이 작동하는 3D 플랫폼 작성자 튜토리얼을 확인하거나 3D 동적 캐릭터 튜토리얼을 확인하는 것이 가치 있는 일일 것입니다.


3D에서, 수학적인 부분이 대부분 2D에 비해 복잡해졌습니다. 그러니 위키의 벡터 수학(수학자나 공학자가 아닌, 게임 개발자를 위해 창조된)도 확인해보세요. 3D 게임을 효율적으로 개발하는데 길을 닦는 것을 도와줄겁니다.



공간 노드(Spatial node)


Node2D는 2D의 기본 노드입니다. 컨트롤은 모든 GUI의 기본 노드이구요. 이에 따라, 모든 3D를 위해 3D 엔진은 공간 노드를 사용합니다.


../../../_images/tuto_3d1.png

부모 노드에 관련된 공간 노드는 로컬 위치를 가집니다 (부모 노드가 공간 타입을 상속받을 때에). 이 위치(transform)는 4x3 위치로 접근될 수 있으며, 또는 세 벡터3 멤버가 위치를 대표합니다. 오일러 회전(x, y 그리고 z 각도)과 스케일.


../../../_images/tuto_3d2.png


3D 콘텐츠


2D와 다르게, 로딩 이미지 콘텐츠와 그림이 직관적입니다. 3D가 조금 더 어렵습니다. 이 콘텐츠는 특별한 3D 툴을 사용해 창조될 수 있고(주로 DCC로 대표되는) 파일 형식을 바꾸어 고도에 입력된 순서대로 출력할 수 있습니다(3D 형식은 이미지로 표준화될 수 없습니다).



DCC-생성 모델


고도에는 3D 모델을 수입(import : 임포트)하는데 두 개의 파이프라인이 있습니다. 첫번째이며 대부분 사용하는 건 전체 씬을 수입하는 것(DCC에서 볼 수 있듯이)을 허용하는 3D 씬 임포팅 임포터를 사용하는 것입니다. 애니메이션과 스켈레톤 리그(skeleton rigs), 블렌드 쉐이프(blend shape) 등이 포함됩니다.


두번째 파이프라인은 3D 메시 임포팅 임포터를 통한 것입니다. 이 두번째 방법은 임포팅을 간단하게 허용해줍니다. OBJ 파일을 메시 리소스로 저장한 다음 MeshInstance 노드에 넣어 표시할 수 있습니다.



생성된 기하학


메시 리소스를 직접 사용해서 커스텀 기하학을 만들 수 있습미다. 간단하게 여러분의 배열을 만들고 Mesh.add_surface() 함수를 사용합니다. 도움을 주는 클래스도 사용가능합니다. SurfaceTool은 보다 직관적인 API 및 도우미를 제공하여 법선, 접선등을 생성합니다.


어쨌든 이 방법은 정점 배열을 생성하고 이를 3D API에 제출함으로 상당한 성능 비용이 들기 때문에 정적인 기하학(자주 업데이트 되지 않는 모델)을 생성하기 위한 것입니다.



즉석 기하학


만약, 대신에 자주 업데이트 되는 간단한 기하학을 만들 필요가 있다면 고도는 ImmediateGeomety라는 OpenGL 1.x 형태의 즉석 모드 API로 점, 선, 삼각형 등을 생성할 수 있는 특별한 노드를 제공합니다.



2D in 3D


고도가 강력한 2D 엔진을 가지기 때문에 많은 게임이 3D 환경에서 2D를 사용합니다. 회전하지 않는 고정된 카메라를 사용함으로써 (직각 혹은 원근법 모두에서), 3D 배경, 더 현실적인 패럴렉스, 조명/그림자 효과 등을 3D와 섞는 데에 이득을 가지는 Sprite3D와 AnimatedSprite3D와 같은 노드는 2D 게임을 생성하는데 사용할 수 있습니다.


이에 대한 불이익은 물론, 복잡성이 더해지므로 2D에 비해 성능이 떨어지며 그 만큼 픽셀 단위로 작업하는 데 대한 참조가 부족합니다.



환경


게다가 씬을 편집할 때, 환경을 편집하는 건 매우 일반적입니다. 고도는 배경 색을 바꿀 수 있게 허용하는 WorldEnvironment 노드를 제공하며, 모드와 내장된 전처리 효과의 몇몇 종류를 

사용하는데 쓸 수 있습니다.환경은 카메라에 오버라이드될 수 있습니다.



3D 뷰포트


3D 씬을 편집하는 것은 3D 탭에서 수행할 수 있습니다. 이 탭은 수동적으로 선택될 수 있지만, Spatial 노드가 선택되면 자동으로 허용될 것입니다.


../../../_images/tuto_3d3.png

기본설정의 3D 씬 네비게이션 컨트롤은 블렌더(Blender) (무료 소프트 웨어 파이프 라인의 몇몇 일관성을 가지는 것을 목표로..)와 비슷하지만, 옵션이 커스터마이즈 마우스 버튼과 에디터 세팅의 다른 툴과 비슷한 행동들이 포함되어 있습니다.


../../../_images/tuto_3d4.png


좌표 시스템


고도는 모든 것에 미터법 시스템을 사용합니다. 3D 물리학이나 다른 영역이 이에 맞추어져 있으며, 그래서 다른 스케일(scale)을 사용하는 것은 좋지 못한 생각(여러분이 여러분이 무엇을 하고있는지 알더라도)입니다.


3D 에셋으로 작업하고 있다면 정확한 스케일(DCC를 미터법으로 설정)로 작업하는 것이 항상 최고의 방법입니다. 고도는 스케일링을 미리 임포트 하는 것을 허용하고, 대부분의 경우에  작동하며 흔치 않은 상황에 렌더링이나 물리적인 부분처럼 민감한 영역에서 부동 소수점 정확성 문제(이로 인한, 고장 또는 아티팩트)가 발생할 수 있습니다. 그러니, 여러분의 아티스트가 언제나 맞는 스케일에서 작업하도록 확실히 하세요!


Y 좌표는 "위"를 나타낼 때 사용합니다. 정렬이 필요한 대부분의 객체(빛, 카메라, 캡슐 콜라이더, 차량 등 처럼)의 경우, Z 축은 "가리키는 방향"으로 사용됩니다. 이 관례는 대충 다음을 뜻합니다 :


  • X는 옆
  • Y는 위/아래
  • Z는 앞/뒤


공간과 기즈모 조작


3D 뷰에서 오브젝트를 움직이는 건 조작하는 기즈모를 통해 가능합니다. 각 축은 색깔로 대표됩니다 : 빨강, 초록, 파랑은 X, Y, Z를 각각 대표합니다. 이 관례는 격자와 다른 기즈모에도 적용됩니다 (또한 쉐이더 언어, Vector3를 위한 컴포넌트 순서, 색깔 등).


../../../_images/tuto_3d5.png

몇몇 유용한 키바인딩 :


  • 모션과 회전을 휙 잡고 싶다면, 움직이거나 스케일링 또는 회전 중에 "s"키를 눌러서 멈추세요.
  • 뷰의 중앙에 선택된 물체를 놓으려면 "f"키를 누르세요.


뷰 메뉴


뷰 옵션은 " [ 뷰 ] " 메뉴에서 제어됩니다. 창 안의 이 작은 메뉴에 집중해주세요. 왜냐하면 이 것이 자주 간과되기 때문입니다!


../../../_images/tuto_3d6.png


기본 조명


3D 뷰는 조명에 몇몇 기본 옵션을 가집니다.


  • 물체를 보이게 하며 편집 중에 기본으로 켜지는 방향을 가진 빛이 있습니다. 게임을 실행하는 동안에는 더이상 보이지 않게 됩니다.
  • 및이 닿을 수 없지만 눈에 보이는 장소를 피하기 위한 미묘한 기본 환경 빛이 있습니다. 게임을 실행하면 더 이상 보이지 않게 됩니다 (그리고 기본 빛이 꺼질 때도 마찬가지입니다).

"Default Light"옵션을 토글해서 끔으로써 저 행동들은 모두 가능합니다 :

../../../_images/tuto_3d8.png
이를 커스터마이징하는 것(그리고 다른 기본 뷰 옵션들도)은 설정 메뉴를 통해 가능합니다 :

../../../_images/tuto_3d7.png

이 창이 열리면, 주변의 빛과 기본 빛 방향을 커스터마이즈 하는 것이 허용됩니다 :


../../../_images/tuto_3d9.png



카메라


얼마나 많은 오브젝트가 3D 공간에 있든 상관없이, 카메라가 씬에 더해지지 않으면 아무것도 보여지지 않을 것입니다. 카메라는 직각(orthogonal) 또는 원근법(perspective) 프로젝션에서 모두 작동합니다 :

../../../_images/tuto_3d10.png
카메라는 연관되어 있으며 부모 혹은 할아버지 대의 뷰포트에만 표시됩니다. 씬 트리의 루트가 뷰포트이기 때문에 카메라는 기본적으로 보여주지만, 만약 서브 뷰포트(렌더 목표 또는 픽쳐-인-픽쳐도 마찬가지로)가 필요하면 그들은 보여지기 위해 자신만의 자식 카메라가 필요합니다.


../../../_images/tuto_3d11.png

다수의 카메라를 다룰  때, 다음이 각 뷰포트가 따라야 하는 규칙들입니다 :


  • 씬 트리에 현재 카메라가 없다면, 제일 처음으로 들어오는 카메라가 활성화됩니다. 그 이후에 씬에 들어오는 카메라들은 다 무시됩니다 (그들이 현재라고 설정되지 않으면).
  • 만약 카메라가 "현재" 속성을 가지면 씬의 어떤 다른 카메라와 상관이 없습니다. 만약 속성이 설정되면 활성화되며, 이전 카메라들은 무시됩니다.
  • 만약 활성화된 카메라가 씬에서 떠나면, 트리 순서의 첫번째 카메라가 그 자리를 차지합니다.


조명


고도에서는 몇 개의 빛이나 어떤 타입의 빛이어도 제한이 없습니다. 원하는 만큼 추가할 수 있습니다 (성능이 허용하는 한). 하지만 그림자 지도는 제한됩니다. 더 많이 사용될수록 전체적인 질이 떨어집니다.


doc_light_baking을 사용할 수 있으며, 거대한 양의 실시간 빛을 사용하는 것을 피해 성능을 높이세요.