posts

스키마 및 아키텍처

Apr 23, 2026 updated Apr 23, 2026 3dapiarchitecture

image-20250424-014044.png

목차

GL 레이어 구조 개요

GL 컴포넌트 상세 분석

컴포넌트 간 의존 관계

Geometry 클래스 생성 패턴

좌표계와 GL 컴포넌트 통합

  1. GL 레이어 구조

각 레이어마다 역할, 상위 레이어에서 하위 레이어를 사용하여 기능을 구현합니다.

ECharts Core ↓ EChartsGL (최상위 레이어) ↓ LayerGL (WebGL 렌더링 레이어) ↓ ViewGL (장면, 카메라, 뷰포트 관리) ↓ ClayGL (저수준 WebGL 라이브러리)

  1. GL 컴포넌트 상세

ehcart-gl은echarts의 확장으로, 3D 기능을 제공합니다.

echarts-gl의 주요 역할:

layer-gl인스턴스 관리

ECharts 업데이트 후 GL 렌더링 처리

시리즈 및 컴포넌트의view-gl관리

// echarts-gl.js function EChartsGL(zr) { // 각 zlevel별로 LayerGL 객체를 저장할 빈 객체 생성 this._layers = {}; // zrender 인스턴스를 저장 (렌더링을 위한 엔진) this._zr = zr; } // ECharts에 후처리 훅 등록 echarts.registerPostUpdate(function (ecModel, api) { var zr = api.getZr(); var egl = zr.__egl = zr.__egl || new EChartsGL(zr); egl.update(ecModel, api); });

GraphicGL

graphic-gl은clay-gl의 기능을echarts-gl에 맞게 래핑하는 유틸리티 모듈입니다.

다른 컴포넌트에서clay-gl의 기능을 쉽게 사용할 수 있게 해줍니다.

graphic-gl의 역할:

clay-gl클래스 및 유틸리티 함수 제공

셰이더 및 재질 생성 헬퍼 함수 제공

텍스처 로딩 및 관리 기능 제공

// graphicGL.js var graphicGL = {}; // ClayGL 클래스들을 graphicGL에 추가 graphicGL.Renderer = Renderer; graphicGL.Node = Node3D; graphicGL.Mesh = Mesh; graphicGL.Shader = Shader; graphicGL.Material = Material; graphicGL.Texture = Texture; graphicGL.Texture2D = Texture2D; // ... 기타 ClayGL 클래스들 // 유틸리티 함수 추가 graphicGL.createShader = function (prefix) { /* ... / }; graphicGL.createMaterial = function (prefix, defines) { / ... / }; graphicGL.setMaterialFromModel = function (shading, material, model, api) { / ... */ };

LayerGL

layer-gl은web-gl렌더링을 담당하는 레이어로,zrender의 레이어 시스템에 통합됩니다.

layer-gl의 주요 역할:

web-gl컨텍스트 및 렌더러 관리

view-gl인스턴스 관리

이벤트 처리 및 피킹 기능

렌더링 프로세스 조정

// LayerGL.js var LayerGL = function (id, zr) { // Layer ID this.id = id; // zrender 인스턴스 this.zr = zr; // ClayGL 렌더러 생성 this.renderer = new Renderer({ clearBit: 0, devicePixelRatio: zr.painter.dpr, preserveDrawingBuffer: true, premultipliedAlpha: true }); // 뷰 목록 this.views = []; // 레이 피킹 (마우스 이벤트 처리용) this._picking = new RayPicking({ renderer: this.renderer }); };

GraphicGL

graphic-gl은clay-gl의 기능을echarts-gl에 맞게 래핑하는 유틸리티 모듈입니다.

다른 컴포넌트에서clay-gl의 기능을 쉽게 사용할 수 있게 해줍니다.

graphic-gl의 역할:

clay-gl클래스 및 유틸리티 함수 제공

셰이더 및 재질 생성 헬퍼 함수 제공

텍스처 로딩 및 관리 기능 제공

// graphicGL.js var graphicGL = {}; // ClayGL 클래스들을 graphicGL에 추가 graphicGL.Renderer = Renderer; graphicGL.Node = Node3D; graphicGL.Mesh = Mesh; graphicGL.Shader = Shader; graphicGL.Material = Material; graphicGL.Texture = Texture; graphicGL.Texture2D = Texture2D; // ... 기타 ClayGL 클래스들 // 유틸리티 함수 추가 graphicGL.createShader = function (prefix) { /* ... / }; graphicGL.createMaterial = function (prefix, defines) { / ... / }; graphicGL.setMaterialFromModel = function (shading, material, model, api) { / ... */ };

LayerGL

layer-gl은web-gl렌더링을 담당하는 레이어로,zrender의 레이어 시스템에 통합됩니다.

layer-gl의 주요 역할:

web-gl컨텍스트 및 렌더러 관리

view-gl인스턴스 관리

이벤트 처리 및 피킹 기능

렌더링 프로세스 조정

// LayerGL.js var LayerGL = function (id, zr) { // Layer ID this.id = id; // zrender 인스턴스 this.zr = zr; // ClayGL 렌더러 생성 this.renderer = new Renderer({ clearBit: 0, devicePixelRatio: zr.painter.dpr, preserveDrawingBuffer: true, premultipliedAlpha: true }); // 뷰 목록 this.views = []; // 레이 피킹 (마우스 이벤트 처리용) this._picking = new RayPicking({ renderer: this.renderer }); };

ViewGL

view-gl은 3D 장면, 카메라, 뷰포트를 관리하는 컴포넌트입니다.

view-gl의 주요 역할:

3D 장면(Scene) 및 카메라 관리

뷰포트 설정 및 관리

후처리 효과 적용

실제 렌더링 수행

// ViewGL.js function ViewGL(projection) { projection = projection || 'perspective'; // 소속된 레이어 this.layer = null; // ClayGL 장면 this.scene = new Scene(); // 루트 노드 this.rootNode = this.scene; // 뷰포트 정보 this.viewport = { x: 0, y: 0, width: 0, height: 0 }; // 투영 방식 설정 this.setProjection(projection); // 이펙트 컴포지터 (후처리 효과용) this._compositor = new EffectCompositor(); // 시간적 슈퍼샘플링 (안티앨리어싱용) this._temporalSS = new TemporalSuperSampling(); // 그림자 맵 패스 this._shadowMapPass = new ShadowMapPass(); }

ClayGL

clay-gl은echarts-gl에서 사용하는web-gl라이브러리입니다.

clay-gl의 주요 역할:

web-gl컨텍스트 관리

3D 기하 데이터 및 재질 관리

셰이더 프로그램 관리

장면 그래프 및 렌더링 파이프라인 제공

  1. 컴포넌트 간 의존 관계

EChartsGL → LayerGL:

ehcarts-gl은 여러layer-gl인스턴스를 관리합니다.

각zlevel에 대해 하나의layer-gl을 생성합니다.

zlevel은 레이어의 깊이를 나타내며, 요소들도 분리됩니다.

// EChartsGL에서 LayerGL 생성 및 관리 function getLayerGL(model) { var zlevel = model.get('zlevel'); var layers = self._layers; var layerGL = layers[zlevel]; if (!layerGL) { layerGL = layers[zlevel] = new LayerGL('gl-' + zlevel, zr); zr.painter.insertLayer(zlevel, layerGL); } return layerGL; }

LayerGL → ViewGL:

layer-gl은 여러view-gl인스턴스를 관리합니다.

각view-gl은 하나의 3D 장면과 카메라를 관리합니다.

// LayerGL에 ViewGL 추가 LayerGL.prototype.addView = function (view) { if (view.layer === this) { return; } this.views.push(view); view.layer = this; var zr = this.zr; view.scene.traverse(function (node) { node.__zr = zr; if (node.addAnimatorsToZr) { node.addAnimatorsToZr(zr); } }); };

ViewGL → ClayGl:

view-gl은clay-gl의 Scene, Camera 등을 직접 사용합니다. (렌더링 시clay-gl의 기능을 사용)

// ViewGL에서 ClayGL 사용 function ViewGL(projection) { // ClayGL Scene 생성 this.scene = new Scene(); // ClayGL Camera 생성 if (projection === 'perspective') { this.camera = new PerspectiveCamera(); } else { this.camera = new OrthographicCamera(); } }

GraphicGL → ClayGL:

graphic-gl은clay-gl의 클래스와 유틸리티를 래핑 → 다른 컴포넌트에서clay-gl기능을 쉽게 사용합니다.

// GraphicGL에서 ClayGL 래핑 graphicGL.Mesh = Mesh; graphicGL.Material = Material; graphicGL.Shader = Shader;

  1. Geometry 클래스 생성 패턴

echarts-gl에서는 특정 차트 유형에 대해 별도의Geometry클래스를 생성하는 경우가 있습니다.

복잡한 기하 데이터 생성이 필요한 경우:

Bar3D,Surface등 특수한 형태의 기하 데이터가 필요한 경우

데이터에 따라 동적으로 기하 데이터를 생성해야 하는 경우

특수한 렌더링 최적화가 필요한 경우:

정점 정렬, 삼각형 정렬 등 특수한 최적화가 필요한 경우

인스턴싱, 배칭 등의 최적화 기법을 적용해야 하는 경우

예를 들어, Cones3DGeometry는 다음과 같이 구현됩니다:

// Cones3DGeometry.js var ConesGeometry = Geometry.extend(function () { return { // 정점 속성 정의 attributes: { position: new Geometry.Attribute('position', 'float', 3, 'POSITION'), normal: new Geometry.Attribute('normal', 'float', 3, 'NORMAL'), color: new Geometry.Attribute('color', 'float', 4, 'COLOR'), // 기타 속성... }, // 동적 업데이트 활성화 dynamic: true, // 기타 설정... }; }, { // 원뿔 추가 메서드 addBar: function (start, dir, leftDir, size, color, dataIndex) { // 원뿔 기하 데이터 생성 로직... } });

반면, 단순한 기하 데이터는 별도의 클래스 없이 직접 생성하기도 합니다:

// 단순한 기하 데이터 직접 생성 예시 var planeGeometry = new graphicGL.PlaneGeometry(); var mesh = new graphicGL.Mesh({ geometry: planeGeometry, material: material });

  1. 좌표계와 GL 컴포넌트 통합

echarts-gl에서 좌표계(Grid3D, Globe, Geo3D 등)는view-gl과 통합되어 작동합니다:

좌표계 모델에서 ViewGL 생성:

각 좌표계 모델(Grid3DModel, GlobeModel 등)은 자체 ViewGL 인스턴스를 생성합니다.

이 ViewGL은 좌표계의 3D 시각화를 담당합니다.

// grid3DCreator.js grid3DModel.__viewGL = grid3DModel.__viewGL || new ViewGL(); cartesian3D.viewGL = grid3DModel.__viewGL;

좌표계와 시리즈 연결:

시리즈는 좌표계의 ViewGL을 사용하여 3D 요소를 렌더링합니다.

좌표계는 데이터 좌표를 3D 공간 좌표로 변환하는 기능을 제공합니다.

// echarts-gl.js var viewGL = coordSys.viewGL; layerGL.addView(viewGL);

좌표 변환 프로세스:

원본 데이터 → 좌표계 데이터 → 3D 공간 좌표 → 화면 좌표

// 좌표 변환 예시 var point = coordSys.dataToPoint([x, y, z]);