undefined

GIS ๊ฐ•์˜ 1๊ฐ• ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ & 2๊ฐ• ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ฝ”๋“œ

three.js์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ

Renderer

Scene์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๋ Œ๋”๋Ÿฌ

Scene

3์ฐจ์› ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์žฅ๋ฉด. Light์™€ Mesh๋กœ ๊ตฌ์„ฑ๋จ

Light

3์ฐจ์› ํ˜•์ƒ์ด ํ™”๋ฉด ์ƒ์— ํ‘œ์‹œ๋˜๊ธฐ ์œ„ํ•œ ๊ด‘์›

Mesh

Object3D์˜ ํŒŒ์ƒ ํด๋ž˜์Šค. Geometry์™€ Material๋กœ ๊ตฌ์„ฑ

  • Geometry: ํ˜•์ƒ์„ ์ •์˜
  • Material: ์ƒ‰์ƒ ๋ฐ ํˆฌ๋ช…๋„ ๋“ฑ์„ ์ •์˜

Camera

Scene์„ ๋ฐ”๋ผ๋ณด๋Š” ์‹œ์ .

3์ฐจ์›์˜ Scene์€ ์–ด๋Š ์‹œ์ ์—์„œ ๋ฐ”๋ผ๋ณด๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž„. Camera๋กœ ์ด ์‹œ์ ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


PRACTICE: ํšŒ์ „ํ•˜๋Š” ํŒŒ๋ž€์ƒ‰ ์ •์œก๋ฉด์ฒด ๋ Œ๋”๋งํ•˜๊ธฐ

id๊ฐ€ webgl-container์ธ div element ์•ˆ์— 3์ฐจ์› ๊ฐ์ฒด๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

1. WebGL ๋ Œ๋”๋Ÿฌ ์ƒ์„ฑ THREE.WebGLRenderer

  • antialias ์˜ต์…˜์„ true๋กœ ์ฃผ๋ฉด 3์ฐจ์› ์žฅ๋ฉด์ด ๋ Œ๋”๋ง๋  ๋•Œ ์˜ค๋ธŒ์ ํŠธ๋“ค์˜ ๊ฒฝ๊ณ„์„ ์ด ๊ณ„๋‹จ ํ˜„์ƒ ์—†์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ‘œํ˜„๋œ๋‹ค.
  • setPixelRatio ๋ฉ”์†Œ๋“œ๋กœ ํ”ฝ์…€ ๋น„์œจ์„ window.devicePixelRatio๋กœ ์„ค์ •ํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ์— ๋งž๋Š” ํ”ฝ์…€ ๋น„์œจ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • renderer.domElement: canvas ํƒ€์ž…์˜ DOM ๊ฐ์ฒด๋กœ, webgl-container์˜ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  Scene์ด ๋ Œ๋”๋ง ๋  ๊ฒƒ์ด๋‹ค.

2. Scene ๊ฐ์ฒด ์ƒ์„ฑ THREE.Scene()

3. Camera ์…‹์—… THREE.PerspectiveCamera

  • Camera ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ fov, aspect, near, far๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (๋‹ค์Œ ๊ฐ•์˜์—์„œ ์ž์„ธํžˆ ์„ค๋ช…)
  • aspect๋ฅผ webgl-container(๋ Œ๋”๋Ÿฌ DOM ์—˜๋ฆฌ๋จผํŠธ์˜ ๋ถ€๋ชจ ์—˜๋ฆฌ๋จผํŠธ)์˜ aspect์™€ ๊ฐ™๊ฒŒ ์„ค์ •ํ•œ๋‹ค.
  • Camera ๊ฐ์ฒด์˜ position ํ•„๋“œ๋กœ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

4. Light ์…‹์—… THREE.DirectionalLight

  • ๊ด‘์› ์ƒ์„ฑ ์‹œ ๊ด‘์›์˜ ์ƒ‰์ƒ, ์„ธ๊ธฐ, ์œ„์น˜ ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค.
  • ์ƒ์„ฑ๋œ Light ๊ฐ์ฒด๋ฅผ Scene์— ์ถ”๊ฐ€ํ•œ๋‹ค.

5. Mesh(Model) ์…‹์—… THREE.Mesh

  • Mesh๋Š” Geometry(THREE.BoxGeometry) ๊ฐ์ฒด์™€ Material(THREE.MeshPhongMaterial) ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • BoxGeometry: ์ •์œก๋ฉด์ฒด ํ˜•์ƒ์„ ์ •์˜ํ•œ๋‹ค. ๊ฐ€๋กœ, ์„ธ๋กœ, ๊นŠ์ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • MeshPhongMaterial: ์ •์œก๋ฉด์ฒด์˜ ์ƒ‰์ƒ์„ ์ •์˜ํ•œ๋‹ค.
  • ์ƒ์„ฑ๋œ Mesh ๊ฐ์ฒด(cube)๋Š” Scene์— ์ถ”๊ฐ€ํ•œ๋‹ค.

6. resize ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ

  • resize ์ด๋ฒคํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ : Renderer๋‚˜ Camera๋Š” ์ฐฝ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋งˆ๋‹ค ๊ทธ ํฌ๊ธฐ์— ๋งž๊ฒŒ ์†์„ฑ ๊ฐ’์„ ์žฌ์„ค์ •ํ•ด์ค˜์•ผ ํ•จ.
  • resize ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด
    • Camera์˜ aspect๋ฅผ webgl-container์˜ aspect๋กœ ๋‹ค์‹œ ์ง€์ •ํ•œ๋‹ค. aspect ์ง€์ • ํ›„ Camera์˜ updateProjectionMatrix ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
    • Renderer์˜ ์‚ฌ์ด์ฆˆ๋ฅผ webgl-container ํฌ๊ธฐ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. Renderer์˜ setSize ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
  • resize ๋ฉ”์†Œ๋“œ์— this binding ํ•„์š” (this๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฐ์ฒด๊ฐ€ ์ด๋ฒคํŠธ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ด App ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ)

7. Renderer๋กœ 3์ฐจ์› ๊ทธ๋ž˜ํ”ฝ Scene์„ ๋ Œ๋”๋ง

  • Renderer์˜ render ๋ฉ”์†Œ๋“œ๋กœ ํ™”๋ฉด์— ๊ทธ๋ ค์ค€๋‹ค.
    • ํ™”๋ฉด์— ๊ทธ๋ฆด Scene๊ณผ Camera๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • time ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ Œ๋”๋ง์ด ์ฒ˜์Œ ์‹œ์ž‘๋œ ์ดํ›„ ๊ฒฝ๊ณผ๋œ ์‹œ๊ฐ„๊ฐ’์„ ms๋กœ ๋ฐ›๋Š”๋‹ค.
  • ์ด time์„ ์ด์šฉํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
    • ํ๋ธŒ์˜ rotation ํ•„๋“œ๊ฐ’์„ time์— ๋”ฐ๋ผ ๋ณ€ํ™”์‹œํ‚ค๋ฉด์„œ ํ๋ธŒ๋ฅผ ํšŒ์ „์‹œํ‚จ๋‹ค.
  • requestAnimationFrame ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด render ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. -> ์ ๋‹นํ•œ ์‹œ์ ์—, ๋˜๋Š” ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ render๊ฐ€ ํ˜ธ์ถœ๋จ.

๋งˆ๋ฌด๋ฆฌ

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€ ์šฐ๋ฆฌ ํŒ€์ด ํŽธํ•œ ๋ฐฉ์‹๋Œ€๋กœ ๊ณ„์† ๋ณ€๊ฒฝํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์šฐ๋ฆฌ๋Š” Webpack ์„ค์ •๊ณผ yarn์„ ์ด์šฉํ•ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜์˜€๋‹ค. ๊ฐ•์˜์—์„œ๋Š” VScode์˜ Live Server ํ™•์žฅํŒฉ์„ ์ด์šฉํ•ด ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์ด์ง€๋งŒ ์šฐ๋ฆฌ๋Š” webpack-server-dev ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•œ๋‹ค. (ํ™˜๊ฒฝ ๊ตฌ์ถ•์„ ๋„์™€์ฃผ์‹  ํŒ€์›๋ถ„๊ป˜ ๋ฌดํ•œํ•œ ๊ฐ์‚ฌ๋ฅผ)

three.js๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋Š” ์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ฐ„๋‹จํ•œ ๋ Œ๋”๋ง ์‹ค์Šต์„ ํ†ตํ•ด ํ•œ ์ธต ๋” ์—ด์˜๊ฐ€ ๋ถˆํƒ€์˜ฌ๋ž๋‹ค. ํšŒ์ „ํ•˜๋Š” ํŒŒ๋ž€ ์ •์œก๋ฉด์ฒด๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋˜์—ˆ์„ ๋•Œ ๋„ˆ๋ฌด ์‹ ๊ธฐํ•˜๊ณ  ํฅ๋ถ„๋๋‹ค. ๋นจ๋ฆฌ ๋‹ค์Œ ์Šคํ„ฐ๋””๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค!๐Ÿ˜†

 

๊ถ๊ธˆํ–ˆ๋˜ ์  - Pixcel Ratio

Renderer์˜ setPixelRatio๋Š” ๋ Œ๋”๋ง๋˜๋Š” ํ•ด์ƒ๋„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ธ๋ฐ, Pixel Ratio์˜ ๊ฐ’์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง ๋˜๋Š” ์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค.

์™ผ- high pixel ratio, ์˜ค - low pixel ratio

Pixel Ratio๊ฐ€ ๋‚ฎ์œผ๋ฉด ์˜ค๋ฅธ์ชฝ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊นจ์ ธ์„œ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊นจ์ง€๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ ๊ทธ๋Ÿผ Pixel Ratio๊ฐ’์€ ํ•ญ์ƒ window.devicePixelRatio ์ด์–ด์•ผ ํ•˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€? ๋ผ๋Š” ์งˆ๋ฌธ์— ์‚ฐ์—…๋””์ž์ธ๊ณผ ์ถœ์‹  ๊ฐœ๋ฐœ์ž๋ถ„์ด ์ด๋Ÿฐ ์˜ˆ์‹œ๋ฅผ ์ฃผ์…จ๋‹ค.

์™ผ- high pixel ratio, ์˜ค - low pixel ratio

์ด ์˜ˆ์‹œ๋Š” ๋„ˆ๋ฌด ๊ท€์—ฝ๋‹ค. ์˜ค๋ฅธ์ชฝ ๋Œ•๋Œ•์ด ์ฒ˜๋Ÿผ ์ผ๋ถ€๋กœ pixel ratio๋ฅผ ๋‚ฎ์ถฐ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.