[Three] 11. Sprite & Mesh - 텍스트 출력하기

2025. 9. 10. 01:06·Frontend

Three.js의 캔버스에 텍스트를 랜더링할 때는 크게 아래 과정을 따릅니다.

 

  1. 또 다른 캔버스를 만들어 그 안에 텍스트를 '그리고'
  2. 해당 캔버스를 '텍스쳐'로 만든 후
  3. 만든 텍스쳐를 원래 three.js 캔버스 내의 물체에 '씌운다'

1단계까지는 three.js의 요소가 아닌 canvas와 그 context만을 사용하며,

2단계 부터는 three.js의 CanvasTexture와 sprite(혹은 mesh)를 사용합니다.

 

  작업 사용 객체
1단계 텍스트 작성 HTMLCanvasElement, CanvasRenderingContext2D
2단계 텍스쳐 변환 THREE.CanvasTexture
3단계 three.js 내 구현 THREE.SpriteMaterial, THREE.Sprite
or
THREE.MeshBasicMaterial, THREE.Mesh

1. 텍스트 작성

Canvas

Canvas는 일반적으로 HTMLCanvasElement를 생성하는 방법을 따릅니다.

const canvas = document.createElement('canvas');

이 캔버스는 three.js에서 작업하고 있는 캔버스와는 다른 객체입니다.

오직 텍스트를 담는 목적으로만 사용되며 이후 텍스쳐로 변환되기 때문에 크기에 영향을 받지 않습니다.

단, 가로 세로 비율과 폰트 크기에 대한 비율엔 영향을 줄 수 있습니다.

canvas.width = 256;
canvas.height = 256;

Context

Context는 HTMLCanvasElement에서 그림을 그릴 때 사용하는 렌더링 환경 객체입니다.

쉽게 말하자면 캔버스 위에 픽셀 단위로 2D 그래픽을 직접 그리는 도구라고 할 수 있습니다.

우리는 이걸로 위에서 생성한 캔버스 위에 텍스트를 '그릴' 수 있습니다.

const context = this.canvas.getContext('2d') as CanvasRenderingContext2D;

위에서 명시하듯, 여기서는 CanvasRenderingContext2D라는 객체 타입을 사용합니다.

타입을 명시한 이유는 getContext( ) 함수가 [context 타입] | null의 형태로 반환하기 때문인데,

이는 함수로 전달하는 매개변수(여기서는 '2d')가 올바르지 않으면 null을 반환하기 때문입니다.

 

매개변수   반환 타입 (null 생략)
2d ⇒ CanvasRenderingContext2D
webgl ⇒ WebGLRenderingContext
bitmaprenderer ⇒ ImageBitmapRenderingContext
... ⇒ ...

전달 가능한 매개변수 중 일부는 아래와 같으며, 이에 따라 반환하는 타입 또한 달라집니다.

 

context에서는 아래와 같은 값들을 설정할 수 있습니다.

context.fillStyle = 'white';                // 칠하는 색
context.strokeStyle = 'black';              // 선(테두리)의 색
context.lineWidth = fontSize * 0.1;         // 선의 두께
context.font = `${fontSize}px Pretendard`;  // 글꼴
context.textAlign = 'center';               // 텍스트 가로 정렬
context.textBaseline = 'middle';            // 텍스트 세로 정렬
context.lineJoin = 'round';                 // 코너 처리

마지막으로 남은 작업이 실제로 캔버스에 그림을 그리는 것입니다.

이전에 설정했던 context대로 stroke(선)와 fill(칠)을 그릴 수 있습니다.

const text = "....";
context.strokeText(text, canvas.width/2, canvas.height/2); // 선 그리기
context.fillText(text, canvas.width/2, canvas.height/2);   // 칠 그리기

2. 텍스쳐 변환

Context를 이용해 그림(텍스트)을 그린 캔버스를 material로 사용할 수 있도록 텍스쳐로 변환합니다.

const textTexture = new THREE.CanvasTexture(canvas);

필터에 대한 설정도 가능합니다.

textTexture.minFilter = THREE.LinearFilter; // 축소 필터를 선형 필터로 설정

3. Three.js로 구현

텍스트 텍스쳐를 Three.js 공간에 랜더링하는 방법은 공간 내에 물체를 만들어 거기에 텍스쳐를 씌우는 것인데,

어떤 타입의 물체에 씌울 것인지에 따라 크게 두 가지 방법이 있습니다.

 

  • Sprite : 2d 이미지를 랜더링하기 위해 사용하는 물체로, 항상 화면을 바라보는 방향으로 위치해 있습니다.
  • Mesh : 일반적인 물체에 사용하던 그 mesh 타입입니다. 공간에 고정되기 때문에 화면 시점과 무관하게 방향이 고정됩니다.

Sprite

material은 SpriteMaterial( ) 객체를 사용합니다.

시점에 따라 객체가 회전하므로 회전값을 별도로 넣을 필요가 없습니다.

// material
const spriteMaterial = new THREE.SpriteMaterial({
    map: textTexture,
    transparent: true, // background opacity
})

// sprite
const sprite = new THREE.Sprite(spriteMaterial);
sprite.position.copy(position);
scene.add(sprite);

Mesh

material은 MeshBasixMaterial( ) 객체를 사용하였습니다(다른 종류의 material을 사용해도 무방할 듯 합니다).

객체의 회전방향이 고정되어 있기 때문에 별도의 회전값을 넣어주어야 합니다.

또한 geometry의 경우 면만 필요하기 때문에 PlaneGeometry( )를 사용하였습니다.

// material
const material = new THREE.MeshBasicMaterial({
    map: textTexture,
    transparent: true,
})
// mesh
const mesh = new THREE.Mesh(new THREE.PlaneGeometry(width, height), material);
mesh.position.copy(position);
mesh.rotation.copy(rotation);
scene.add(mesh);

Mesh(TextPlane)은 시점에 따라 보이는 모습이 달라지지만 Sprite(TextSprite)는 시점이 바뀌어도 항상 정면을 바라봄.

 

728x90

'Frontend' 카테고리의 다른 글

[Frontend][Deploy] Netlify로 프론트엔드 배포하기  (0) 2025.09.11
[Three] 10. Ray casting  (0) 2025.09.04
[Three] Cannon.js - 물리엔진 적용하기  (1) 2025.07.10
[Three] 1인칭 화면 회전 만들기  (0) 2025.07.09
[Three] 윈도우 크기에 따라 반응형으로 만들기  (0) 2025.07.05
'Frontend' 카테고리의 다른 글
  • [Frontend][Deploy] Netlify로 프론트엔드 배포하기
  • [Three] 10. Ray casting
  • [Three] Cannon.js - 물리엔진 적용하기
  • [Three] 1인칭 화면 회전 만들기
Rayi
Rayi
  • Rayi
    아카이브
    Rayi
  • 전체
    오늘
    어제
    • 분류 전체보기 (276)
      • CS (40)
        • CV (2)
        • PS (34)
      • Reveiw (18)
        • Paper (18)
        • Github (0)
      • ML (8)
        • Pytorch (5)
      • Language (59)
        • Python (8)
        • JavaScript (32)
        • TypeScript (16)
        • C++ (3)
      • IDE (12)
      • Git (13)
      • Frontend (77)
        • React (8)
        • ReactNative (6)
        • SolidJS (20)
        • CSS (12)
      • Backend (44)
        • DB (18)
        • Node.js (11)
      • UI (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    review
    ts
    react
    GAN
    DB
    mongo
    SOLID
    ML
    PRISMA
    CSS
    deploy
    postgresql
    expo
    ReactNative
    nodejs
    python
    Three
    vscode
    backend
    frontend
    Express
    PyTorch
    modal
    CV
    CS
    js
    ps
    Git
    API
    figma
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Rayi
[Three] 11. Sprite & Mesh - 텍스트 출력하기
상단으로

티스토리툴바