본문으로 건너뛰기

[SDK] Core

note

내부 자료의 유출 방지를 위해 공개 가능한 범위에서의 자료만 공유합니다.

소개

3D 게임 엔진 기반으로 Web, Mobile, Standalone 에서 3D 가상 인테리어를 위한 기능을 제공하는 SDK 입니다.

3D 도면 뷰어, 3D 제품 뷰어, 3D 스타일링 에디터를 제공합니다.

  • 3D 도면 뷰어
  • 3D 제품 뷰어
  • 3D 스타일링 에디터
    • 3D 모델 파일 인스턴스화 및 배치
    • 3D Procedural 제품 생성 및 배치
    • 3D 제품 트랜스폼 (이동, 회전, 스케일)
    • 3D 제품 충돌 방지 ON, OFF
    • 빛 (Directional, Ambient, Specular) 설정

왜 앱이 아니라 SDK 였을까요?

3D 인테리어 기능을 쓰고 싶어 하는 곳이 한 군데가 아니었기 때문입니다. 자사 웹 서비스도 있고, 가구 회사의 모바일 앱도 있고, 매장에 놓는 키오스크도 있습니다. 화면과 사업 모델은 전부 다른데 "도면을 띄우고 가구를 놓는다"는 알맹이는 똑같습니다.

이럴 때 앱을 여러 벌 만들면 기능 하나 고칠 때마다 여러 벌을 똑같이 고쳐야 합니다. 그래서 알맹이만 떼어내 부품(SDK) 으로 만들고, 껍데기는 각자 만들도록 나눴습니다. 자동차로 치면 엔진만 만들어 파는 쪽에 가깝습니다.

하나의 코드베이스로 세 플랫폼을 지원하기

3D 렌더링 코드는 플랫폼마다 다시 짜기가 특히 부담스러운 영역입니다. 셰이더, 좌표계, 광원 처리 같은 부분이 조금만 어긋나도 결과 이미지가 달라 보이기 때문입니다. 그래서 게임 엔진 하나로 작성하고, 배포 시점에 플랫폼별 산출물로 뽑아내는 방식을 택했습니다.

대상산출물호출하는 쪽
WebWASM (WebGL)브라우저 JavaScript
iOS · Android네이티브 라이브러리모바일 앱
StandaloneDLL데스크톱 응용 프로그램

여기서 까다로운 부분은 경계면입니다. 브라우저의 JavaScript와 엔진 내부는 서로 남남이라, 함수 하나 부르려 해도 규칙을 미리 정해 둬야 합니다. 그래서 "밖에서 부를 수 있는 기능"의 목록과 인자 형태를 SDK 명세로 고정하고, 플랫폼이 달라도 같은 이름으로 부를 수 있게 맞췄습니다.

런타임 로드가 필요했던 이유

가구와 마감재 카탈로그는 계속 늘어납니다. 신제품이 들어올 때마다 앱을 다시 빌드해서 심사를 올릴 수는 없는 노릇입니다. 그래서 3D 모델과 마감재를 빌드에 굽지 않고 실행 중에 내려받아 배치하도록 만들었습니다.

이 선택은 편한 대신 값을 치릅니다. 언제 무엇이 들어올지 모르니 메모리 관리와 로딩 순서를 직접 챙겨야 하고, 없는 애셋을 참조했을 때의 처리도 미리 정해 둬야 합니다. 반대로 이걸 해 두면 서버에서 카탈로그만 갱신해도 모든 플랫폼에 동시에 반영됩니다.

배치 기능에서 신경 쓴 것

  • 충돌 방지 켜고 끄기: 실제 인테리어는 가구가 겹치면 안 되지만, 기획 단계에서는 일부러 겹쳐 보고 싶을 때가 있습니다. 그래서 판단을 사용자에게 넘기고 옵션으로 뺐습니다.
  • Procedural 제품 생성: 붙박이장처럼 치수가 상황마다 달라지는 제품은 모델 파일을 치수별로 만들어 둘 수 없습니다. 입력값을 받아 그 자리에서 형상을 만들어 냅니다.
  • 빛 설정: 같은 가구도 조명에 따라 완전히 다른 색으로 보입니다. Directional, Ambient, Specular 를 조절할 수 있게 열어 두었습니다.

담당 범위

  • 3D 도면, 애셋, 마감재 런타임 로드 및 배치 관련 SDK / 라이브러리 개발
  • 멀티플랫폼 메서드 호출 기능 지원 (WebGL, iOS, Android)
  • SDK 기능 명세서 및 클래스 구조 문서 작성 (Doxygen)
  • Surface Shader Customize, Post-Processing
  • 개발환경: C#, Unity3D, Shader, JavaScript

개발 기간

  • First Commit Date: 2018. 04. 30
  • First Release Date: 2018. 08. 30
  • In Operation...

기여도

  • Main Contributor / Committer
  • 참여율: 90% 이상

정리

SDK 는 기능을 잘 만드는 일 못지않게 경계를 잘 긋는 일이라는 걸 오래 배운 프로젝트였습니다. 밖에서 부를 수 있는 것과 안에서만 쓰는 것을 나누고, 그 약속을 문서로 남겨 두는 일이 결국 5년 넘게 운영되는 힘이 된 것 같습니다.

관련해서 모듈을 패키지로 떼어내는 이야기는 Turborepo 모노레포 워크스페이스 도구 정리에도 적어 두었습니다.