๐Ÿ’ช Three w/ GIS DEVELOPER

11172 ๋‹จ์–ด threethree

Preface

๐Ÿ“Œ ๊ฐœ๋ฐœ ๊ณต๋ถ€ 6๊ฐœ์›” ์ฐจ์ธ to-be ๊ฐœ๋ฐœ์ž์˜ ์ž์Šต ๋ธ”๋กœ๊ทธ๐Ÿ™‚๏พ JAN 16 ~ 22, 2022


ํ˜„์žฌ ์ƒํƒœ
๋งจ๋‚  "๊ถ๊ธˆํ•˜๋‹ค, ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค, ์–ธ์  ๊ฐ€ ํ•ด์•ผ์ง€" ํ•˜์ง€ ๋ง๊ณ  ํ•œ ๋ฒˆ ๋„์ „ํ•ด ๋ณธ ์“ฐ๋ฆฌ์ œ์ด์—์Šค!!


Three

Three.js์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ
์ถœ์ฒ˜ : GIS DEVELOPER

Installation

  1. VS Code ๋“ฑ editor ํ•„์š”
  2. Three.js homepage์—์„œ 'download' click
  3. VS Code ์™ผ์ชฝ menu ์ค‘ 'Run and Debug' ์„ ํƒ ํ›„ 'Create launch.json' click
  4. browser ์„ ํƒ
  5. (Run โ†’ Start Debugging)
  6. web server ('live server ๋“ฑ') ์„ค์น˜ ํ›„ ์‹คํ–‰

Geometry

์ •์˜

BufferGeometry class๋ฅผ ํ†ตํ•ด ์ •์˜๋œ๋‹ค.
3์ฐจ์› ๊ฐ์ฒด์˜ ํ˜•์ƒ ๋“ฑ์„ ์ •์˜ํ•œ๋‹ค.
Material๊ณผ ํ•จ๊ป˜ Mesh๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ์ด๋‹ค.

์ข…๋ฅ˜

  • (์˜ˆ์‹œ) Geometry(โ‘  ์ธ์ž1, โ‘ก ์ธ์ž2, โ‘ข ์ธ์ž3, ..., โ“ ์ธ์žN) : OO ๋ชจ์–‘

  • BoxGeometry(โ‘  ๊ฐ€๋กœ, โ‘ก ์„ธ๋กœ, โ‘ข ๊นŠ์ด, โ‘ฃ ๊ฐ€๋กœ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ค ์„ธ๋กœ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ฅ ๊นŠ์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜): ์œก๋ฉด์ฒด ๋ชจ์–‘
    ย ย ย ย โ‘  ๊ฐ€๋กœ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ก ์„ธ๋กœ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ข ๊นŠ์ด (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ฃ ๊ฐ€๋กœ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ค ์„ธ๋กœ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ฅ ๊นŠ์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 1)

  • CircleGeometry(โ‘  ๋ฐ˜์ง€๋ฆ„, โ‘ก ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ข ์‹œ์ž‘ ๊ฐ๋„, โ‘ฃ ์—ฐ์žฅ ๊ฐ๋„) : ์›ํŒ ๋ชจ์–‘
    ย ย ย ย โ‘  ๋ฐ˜์ง€๋ฆ„ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ก ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 8) (์ˆ˜์น˜๊ฐ€ ๋†’์„ ์ˆ˜๋ก ์›์— ๊ฐ€๊นŒ์šด ๋ชจ์–‘์ด ๋จ)
    ย ย ย ย โ‘ข ์‹œ์ž‘ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 0)
    ย ย ย ย โ‘ฃ ์—ฐ์žฅ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 2pi)

  • ConeGeometry(โ‘  ๋ฐ‘๋ฉด ์›์˜ ๋ฐ˜์ง€๋ฆ„, โ‘ก ์›๋ฟ”์˜ ๋†’์ด, โ‘ข ๋‘˜๋ ˆ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ฃ ๋†’์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ค ๋ฐ‘๋ฉด ๊ฐœ๋ฐฉ ์—ฌ๋ถ€, โ‘ฅ ์‹œ์ž‘ ๊ฐ๋„, โ‘ฆ ์—ฐ์žฅ ๊ฐ๋„) : ์›๋ฟ” ๋ชจ์–‘
    ย ย ย ย โ‘  ๋ฐ‘๋ฉด ์›์˜ ๋ฐ˜์ง€๋ฆ„ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ก ์›๋ฟ”์˜ ๋†’์ด (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ข ๋‘˜๋ ˆ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 8) (์ˆ˜์น˜๊ฐ€ ๋†’์„ ์ˆ˜๋ก ๋ฐ‘๋ฉด์ด ์›์— ๊ฐ€๊นŒ์šด ๋ชจ์–‘์ด ๋จ)
    ย ย ย ย โ‘ฃ ๋†’์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 1) (์ˆ˜์น˜๊ฐ€ ๋†’์„ ์ˆ˜๋ก ์˜† ๋ฉด์— ์ธต์ด ์ƒ๊น€)
    ย ย ย ย โ‘ค ๋ฐ‘๋ฉด ๊ฐœ๋ฐฉ ์—ฌ๋ถ€ (๊ธฐ๋ณธ ๊ฐ’ : false)
    ย ย ย ย โ‘ฅ ์‹œ์ž‘ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 0)
    ย ย ย ย โ‘ฆ ์—ฐ์žฅ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 2pi)

  • CylinderGeometry(โ‘  ๋ฐ‘๋ฉด์˜ ๋ฐ˜์ง€๋ฆ„, โ‘ก ์œ—๋ฉด์˜ ๋ฐ˜์ง€๋ฆ„, โ‘ข ์›ํ†ต์˜ ๋†’์ด, โ‘ฃ ๋‘˜๋ ˆ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ค ๋†’์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ฅ ๋ฐ‘๋ฉด ๋ฐ ์œ—๋ฉด ๊ฐœ๋ฐฉ ์—ฌ๋ถ€, โ‘ฆ ์‹œ์ž‘ ๊ฐ๋„, โ‘ง ์—ฐ์žฅ ๊ฐ๋„) : ์›ํ†ต ๋ชจ์–‘
    ย ย ย ย โ‘  ๋ฐ‘๋ฉด์˜ ๋ฐ˜์ง€๋ฆ„ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ก ์œ—๋ฉด์˜ ๋ฐ˜์ง€๋ฆ„ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ข ์›ํ†ต์˜ ๋†’์ด (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ฃ ๋‘˜๋ ˆ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 8) (์ˆ˜์น˜๊ฐ€ ๋†’์„ ์ˆ˜๋ก ๋ฐ‘๋ฉด์ด ์›์— ๊ฐ€๊นŒ์šด ๋ชจ์–‘์ด ๋จ)
    ย ย ย ย โ‘ค ๋†’์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 1) (์ˆ˜์น˜๊ฐ€ ๋†’์„ ์ˆ˜๋ก ์˜† ๋ฉด์— ์ธต์ด ์ƒ๊น€)
    ย ย ย ย โ‘ฅ ๋ฐ‘๋ฉด ๋ฐ ์œ—๋ฉด ๊ฐœ๋ฐฉ ์—ฌ๋ถ€ (๊ธฐ๋ณธ ๊ฐ’ : false)
    ย ย ย ย โ‘ฆ ์‹œ์ž‘ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 0)
    ย ย ย ย โ‘ง ์—ฐ์žฅ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 2pi)

  • SphereGeometry(โ‘  ๋ฐ˜์ง€๋ฆ„, โ‘ก ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ข ์ˆ˜์ง ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ฃ ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์‹œ์ž‘ ๊ฐ๋„, โ‘ค ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์—ฐ์žฅ ๊ฐ๋„, โ‘ฅ ์ˆ˜์ง ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์‹œ์ž‘ ๊ฐ๋„, โ‘ฆ ์ˆ˜์ง ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์—ฐ์žฅ ๊ฐ๋„) : ๊ตฌ ๋ชจ์–‘
    ย ย ย ย โ‘  ๋ฐ˜์ง€๋ฆ„ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ก ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 32) (์ˆ˜์น˜๋ฅผ ๋‚ฎ์ถ”๋ฉด ๊ฐ์ด ์ƒ๊น€)
    ย ย ย ย โ‘ข ์ˆ˜์ง ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 16)
    ย ย ย ย โ‘ฃ ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์‹œ์ž‘ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 0)
    ย ย ย ย โ‘ค ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์—ฐ์žฅ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 2pi)
    ย ย ย ย โ‘ฅ ์ˆ˜์ง ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์‹œ์ž‘ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 0)
    ย ย ย ย โ‘ฆ ์ˆ˜์ง ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์—ฐ์žฅ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : pi)

  • RingGeometry(โ‘  ๋‚ด๋ถ€ ๋ฐ˜์ง€๋ฆ„, โ‘ก ์™ธ๋ถ€ ๋ฐ˜์ง€๋ฆ„, โ‘ข ๊ฐ€์žฅ์ž๋ฆฌ ๋‘˜๋ ˆ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ฃ ๋‚ด๋ถ€ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ค ์‹œ์ž‘ ๊ฐ๋„, โ‘ฅ ์—ฐ์žฅ ๊ฐ๋„) : 2์ฐจ์› ๋ฐ˜์ง€ ๋ชจ์–‘ (camera ์กฐ๋ฆฌ๊ฐœ์ฒ˜๋Ÿผ ์ƒ๊น€)
    ย ย ย ย โ‘  ๋‚ด๋ถ€ ๋ฐ˜์ง€๋ฆ„ (๊ธฐ๋ณธ ๊ฐ’ : 0.5)
    ย ย ย ย โ‘ก ์™ธ๋ถ€ ๋ฐ˜์ง€๋ฆ„ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ข ๊ฐ€์žฅ์ž๋ฆฌ ๋‘˜๋ ˆ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 8)
    ย ย ย ย โ‘ฃ ๋‚ด๋ถ€ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ค ์‹œ์ž‘ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 0)
    ย ย ย ย โ‘ฅ ์—ฐ์žฅ ๊ฐ๋„ (๊ธฐ๋ณธ ๊ฐ’ : 2pi)

  • PlaneGeometryโ‘  ๋„ˆ๋น„, โ‘ก ๋†’์ด, โ‘ข ๋„ˆ๋น„ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ฃ ๋†’์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜) : 2์ฐจ์› ์‚ฌ๊ฐํ˜• ๋ชจ์–‘ (์ง€๋ฆฌ ์ •๋ณด system์ธ GIS์—์„œ 3์ฐจ์› ์ง€ํ˜• ๋“ฑ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์— ์“ฐ์ž„)
    ย ย ย ย โ‘  ๋„ˆ๋น„ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ก ๋†’์ด (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ข ๋„ˆ๋น„ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ฃ ๋†’์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 1)

  • TorusGeometryโ‘  ๋ฐ˜์ง€๋ฆ„, โ‘ก ์•ˆ์ชฝ ๋ฐ˜์ง€๋ฆ„(?), โ‘ข ๋ฐฉ์‚ฌ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ฃ ์›ํ†ต์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜, โ‘ค ์—ฐ์žฅ ๊ฐ๋„์˜ ๊ธธ์ด) : 2์ฐจ์› ๋ฐ˜์ง€ ๋ชจ์–‘
    ย ย ย ย โ‘  ๋ฐ˜์ง€๋ฆ„ (๊ธฐ๋ณธ ๊ฐ’ : 1)
    ย ย ย ย โ‘ก ์•ˆ์ชฝ ๋ฐ˜์ง€๋ฆ„(?) (๊ธฐ๋ณธ ๊ฐ’ : 0.4)
    ย ย ย ย โ‘ข ๋ฐฉ์‚ฌ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 8)
    ย ย ย ย โ‘ฃ ์›ํ†ต์— ๋Œ€ํ•œ ๋ถ„ํ•  ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’ : 6) (์ˆ˜์น˜๊ฐ€ ๋†’์„ ์ˆ˜๋ก ๊ฐ์ด ์—†๋Š” ๊ณก๋ฉด์ด ๋จ)
    ย ย ย ย โ‘ค ์—ฐ์žฅ ๊ฐ๋„์˜ ๊ธธ์ด (๊ธฐ๋ณธ ๊ฐ’ : 2pi)

  • TorusKnotGeometry(โ‘  ์ธ์ž1, โ‘ก ์ธ์ž2, โ‘ข ์ธ์ž3, โ‘ฃ ์ธ์ž4, โ‘ค ์ธ์ž5) : ๋ฐฐ๋ฐฐ ๊ผฌ์—ฌ์žˆ์Œ... (ํ™œ์šฉ๋„๊ฐ€ ๋‚ฎ์•„์„œ ์„ค๋ช… ์ƒ๋žต)

โ€ป ๋ชจ๋“  '์‹œ์ž‘ ๊ฐ๋„'์™€ '์—ฐ์žฅ ๊ฐ๋„'์˜ ๊ฐœ๋…์€ CircleGeometry์˜ '์‹œ์ž‘ ๊ฐ๋„' ๋ฐ '์—ฐ์žฅ ๊ฐ๋„'์™€ ๋™์ผ

// ์˜ˆ์‹œ
const geometry = new THREE.BoxGeometry(1, 1, 1);
const geometry = new THREE.CircleGeometry(0.9, 16, Math.PI/2, Math.PI);

Material

์ •์˜

3์ฐจ์› ๊ฐ์ฒด์˜ ์ƒ‰์ฒด๋‚˜ ํˆฌ๋ช…๋„ ๋“ฑ์„ ์ •์˜ํ•œ๋‹ค.
Geometry์™€ ํ•จ๊ป˜ Mesh๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ์ด๋‹ค.

ํŠน์ง•

๋ชจ๋“  ์žฌ์งˆ์€ Material class๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. (๋ชจ๋“  ์žฌ์งˆ์€ Material class์˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.)
e.g. visible, transparent, opacity, depthTest, depthWrite, side...
์žฌ์งˆ์€ ์ž์‹ ์˜ ์†์„ฑ ๊ฐ’ ๋ณ€ํ™”์™€ ์™ธ๋ถ€ ๊ด‘์›์˜ ์˜ํ–ฅ์— ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘ํ•œ๋‹ค.

์ข…๋ฅ˜

  • Mesh
    • MeshBasicMaterial
    • MeshLambertMaterial
    • MeshPhongMaterial
    • PBR (Physically Based Rendering)
      • MeshStandardMaterial
      • MeshPhysicalMaterial
  • Line
    • LineBasicMaterial
    • LineDashedMaterial
  • Points
    • PointsMaterial

Mesh material์—์„œ texture๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ

  • map
    • map
    • alphaMap
    • aoMap
    • displacementMap
    • lightMap
    • metalnessMap
    • normalMap
    • roughnessMap
    • minmap
  • texture
    • repeat.x, repeat.y
    • wrapS, wrapT
    • offset.x, offset.y
    • rotation
    • center.x, center.y
    • magfilter, minfilter

Mesh (Object3D)

์ •์˜

Mesh, Line, Position ๋“ฑ์˜ ํŒŒ์ƒ class๋กœ 3์ฐจ์› ๊ฐ์ฒด๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•œ๋‹ค.
position, rotation, scale์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๋ฉฐ ์ด๋Š” 4X4 ํฌ๊ธฐ์˜ ํ–‰๋ ฌ ์ •๋ณด๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

Object3D์˜ ํŒŒ์ƒ class

  • Mesh : ์‚ผ๊ฐํ˜• ๋ฉด์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„
    • x, y, x (๊ธฐ๋ณธ ๊ฐ’ : 0)
  • Line : ์„ ํ˜• ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„
    • Line
    • LineLoop
      • x, y, x (๊ธฐ๋ณธ ๊ฐ’ : 0)
  • Points : ์ ์„ ํ‘œํ˜„
    • x, y, x (๊ธฐ๋ณธ ๊ฐ’ : 1)

์†์„ฑ

  • position : ์œ„์น˜
    • x, y, x (๊ธฐ๋ณธ ๊ฐ’ : 0)
  • rotation : ํšŒ์ „
    • x, y, x (๊ธฐ๋ณธ ๊ฐ’ : 0)
  • scale : ํฌ๊ธฐ
    • x, y, x (๊ธฐ๋ณธ ๊ฐ’ : 1) (1์€ ์›๋ž˜ ํฌ๊ธฐ, 2๋Š” ๋‘ ๋ฐฐ...)

Scene Graph

์ •์˜

3์ฐจ์› ๊ณต๊ฐ„ ์ƒ์˜ ์žฅ๋ฉด ๊ตฌ์„ฑ์œผ๋กœ์„œ 3์ฐจ์› ๊ฐ์ฒด๋ฅผ ๊ณต๊ฐ„ ์ƒ์— ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ scene graph๋ฅผ code๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ์ฒด ์ด๋ฆ„, ๊ฐ์ฒด ํ˜•์‹, ๋ถ€๋ชจ - ์ž์‹ ๊ด€๊ณ„๋ฅผ ๋„ํ‘œ๋กœ ๋‚˜ํƒ€๋‚ธ ํ›„ code๋กœ ์˜ฎ๊ธด๋‹ค.
(์˜ˆ์‹œ๊ฐ€ js file ์ „์ฒด๋ผ ๋ชป ์˜ฎ๊ธฐ๊ฒ ์Œ...!)


Custom Geometry

  • position
  • normal
  • color
  • uv
  • vertex index

Light

light class๋ฅผ ์ƒ์† ๋ฐ›๋Š” ์—ฌ์„ฏ ๊ฐœ์˜ ๊ด‘์› class๊ฐ€ ์žˆ๋‹ค.
์˜ˆ์‹œ์—์„œ๋Š” ๊ด‘์›์„ ํ•˜๋‚˜์”ฉ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ณด๋‹ค ๋‚˜์€ rendering ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ด‘์›์„ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

  • ํ™˜๊ฒฝ๊ด‘ ํ˜น์€ ์ฃผ๋ณ€๊ด‘
    • THREE.AmbientLight(๋น›์˜ ์ƒ‰์ƒ, ๋น›์˜ ์„ธ๊ธฐ)
      • ๋น›์˜ ์ƒ‰์ƒ๊ณผ ๋น›์˜ ์„ธ๊ธฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
      • ๋‹จ์ˆœํžˆ scene์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฌผ์ฒด์— ๋Œ€ํ•ด ๋‹จ์ผ ์ƒ‰์ƒ์œผ๋กœ renderingํ•˜๋„๋ก ํ•จ
      • ์„ธ๊ธฐ๋ฅผ ๋งŽ์ด ๋‚ฎ์ถ”์–ด ๊ด‘์›์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ๋ฌผ์ฒด๋„ ์‚ด์ง ๋ณด์—ฌ์ง€๊ฒŒ ํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ
    • THREE.HemisphereLight(์œ„์—์„œ ๋น„์น˜๋Š” ๋น›์˜ ์ƒ‰์ƒ, ์•„๋ž˜์—์„œ ๋น„์น˜๋Š” ๋น›์˜ ์ƒ‰์ƒ, ๋น›์˜ ์„ธ๊ธฐ)
      • ๋น›์˜ ์ƒ‰์ƒ ๋‘ ๊ฐ€์ง€์™€ ๋น›์˜ ์„ธ๊ธฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
  • ๋ฐฉํ–ฅ์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ด‘
    • THREE.DirectionalLight(๋น›์˜ ์ƒ‰์ƒ, ๋น›์˜ ์„ธ๊ธฐ)
      • ํƒœ์–‘์ฒ˜๋Ÿผ ๋น›๊ณผ ๋ฌผ์ฒด ๊ฐ„์˜ ๊ฑฐ๋ฆฌ์— ์ƒ๊ด€์—†์ด ๋™์ผํ•œ ๋น›์˜ ํšจ๊ณผ๋ฅผ ์คŒ
      • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋น›์˜ position๊ณผ target ์†์„ฑ์˜ position์œผ๋กœ ๊ฒฐ์ •๋˜๋Š” ๋ฐฉํ–ฅ๋งŒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Œ
    • THREE.PointLight(๋น›์˜ ์ƒ‰์ƒ, ๋น›์˜ ์„ธ๊ธฐ)
      • ๋น›์˜ ์ƒ‰์ƒ ๋‘ ๊ฐ€์ง€์™€ ๋น›์˜ ์„ธ๊ธฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
      • ๋น›์ด ๊ด‘์› ์œ„์น˜์—์„œ ์‚ฌ๋ฐฉ์œผ๋กœ ํผ์ ธ๋‚˜๊ฐ
      • light.distance ์š”์†Œ๋ฅผ ํ†ตํ•ด ์ง€์ •๋œ ๊ฑฐ๋ฆฌ๊นŒ์ง€๋งŒ ๊ด‘์›์˜ ์˜ํ–ฅ์ด ๋ฏธ์นจ
    • THREE.SpotLight(๋น›์˜ ์ƒ‰์ƒ, ๋น›์˜ ์„ธ๊ธฐ)
      • ๋น›์˜ ์ƒ‰์ƒ ๋‘ ๊ฐ€์ง€์™€ ๋น›์˜ ์„ธ๊ธฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
      • light.penumbra ์š”์†Œ๋ฅผ ํ†ตํ•ด ๋น›์˜ ๊ฐ์‡„๋ฅผ ์กฐ์ •
    • THREE.RectAreaLight(๋น›์˜ ์ƒ‰์ƒ, ๋น›์˜ ์„ธ๊ธฐ, ๊ด‘์›์˜ ๊ฐ€๋กœ ํฌ๊ธฐ, ๊ด‘์›์˜ ์„ธ๋กœ ํฌ๊ธฐ)
      • ๋น›์˜ ์ƒ‰์ƒ, ๋น›์˜ ์„ธ๊ธฐ, ๊ด‘์›์˜ ๊ฐ€๋กœ ๋ฐ ์„ธ๋กœ ํฌ๊ธฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
      • ๋งˆ์น˜ ํ˜•๊ด‘๋“ฑ์ด๋‚˜ ์ฐฝ๋ฌธ์—์„œ ๋“ค์–ด์˜ค๋Š” ๊ด‘์›
      • ๋‘ ๊ฐœ์˜ import code ํ•„์š”
      • ์ด์ „์—๋Š” ๊ด‘์›์˜ ๋ฐฉํ–ฅ์„ ๋Œ€์ƒ์˜ ์œ„์น˜๋กœ ์ง€์ •ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ๋„๋กœ ์ง€์ •ํ•จ

Camera

Object3D class๋ฅผ ์ƒ์†๋ฐ›๋Š” Camera class์— ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ camera๊ฐ€ ์žˆ๋‹ค.

  • THREE.PerspectiveCamera(fovy, aspect, zNear, zFar)
    • ๊ฐ€๊นŒ์ด ์žˆ๋Š” ๋ฌผ์ฒด๊ฐ€ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋ฌผ์ฒด๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ํฌ๊ฒŒ ๋ณด์ด๋„๋ก ์›๊ทผ๊ฐ์„ ํ‘œํ˜„ํ•ด์„œ rendering
    • fovy : ์ ˆ๋‘์ฒด์˜ ๋†’์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ๊ฐ๋„ (๋‹จ์œ„ : degree)
    • aspect : ์ ˆ๋‘์ฒด์˜ ๊ฐ€๋กœ ๊ธธ์ด๋ฅผ ์„ธ๋กœ ๊ธธ์ด๋กœ ๋‚˜๋ˆˆ ๋น„์œจ
    • zNear, zFar : camera๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ์ด๋ฉฐ, ์ด ์˜์—ญ์˜ ๋ฌผ์ฒด๋งŒ rendering๋จ
  • THREE.OrthographicCamera(xLeft, xRight, yTop, yBottom, zNear, zFar)
    • ๋ฌผ์ฒด ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๊ฐ (์›๊ทผ๊ฐ) ์—†์ด ๋ฌผ์ฒด์˜ ํฌ๊ธฐ๋Œ€๋กœ rendering
    • DOM ์š”์†Œ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ xLeft, xRight์˜ ๊ฐ’์ด ์ง€์ •๋˜๋ฏ€๋กœ DOM ์š”์†Œ์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด camera์˜ xLeft์™€ xRight ๊ฐ’๋„ ๋ณ€๊ฒฝํ•ด ์ฃผ์–ด์•ผ ํ•จ

Shadow

Three.js์—์„œ ๊ทธ๋ฆผ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ด‘์›์€ THREE.PointLight, THREE.PointLight, THREE.SpotLight์ด๋‹ค.
๊ทธ๋ฆผ์ž๋ฅผ renderingํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด์— ์„ธ ๊ฐ€์ง€๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

  • renderer
  • ๊ด‘์›
    • ๊ทธ๋ฆผ์ž๋ฅผ ์ง€์›ํ•˜๋Š” ๊ด‘์›์€ ๋ชจ๋‘ shadow๋ผ๋Š” ์†์„ฑ์„ ๊ฐ–๊ณ , ์ด shadow ์†์„ฑ์—๋Š” camera ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ด camera๊ฐ€ ๊ทธ๋ฆผ์ž์— ๋Œ€ํ•œ texture image๋ฅผ ์ƒ์„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ
  • model


Endnote

๐Ÿ”— related documents

threejs.org

๐Ÿ™‡ the source of this content

GIS DEVELOPER

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ