Three.js: ES6 JSM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ณ„์† ์ง€์›

์— ๋งŒ๋“  2020๋…„ 10์›” 05์ผ  ยท  51์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

๊ธฐ๋Šฅ ์š”์ฒญ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“ˆ ๋ฐ ํด๋ž˜์‹ ์ •์  ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ„์ƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž ๊ทธ๋ฃน์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ณ ์ „์ ์ธ ๋‹จ์ˆœ JS ํŒŒ์ผ์ด ํฌํ•จ๋œ ์ •์  ํŒŒ์ผ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‚˜๋Š” ๊ทธ์ € ์ด์ƒํ•œ ์‚ฌ๋žŒ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์‚ฌ๋ฌผ๋กœ๋ถ€ํ„ฐ ๋‹น์‹ ์„ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ์ถ”์ƒํ™”ํ•˜๋Š”์ง€, ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹น์‹ ์„ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์ •๋ง ์‹ซ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋ชจ๋“ˆ ํฌํ•จ์€ ๊ธฐ์กด JS ํฌํ•จ๋ณด๋‹ค ๋œ ์ง๊ด€์ ์ด๋ฉฐ ์ •์  ํŒŒ์ผ ์„ค์ • ๋‚ด์—์„œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ข…์ข… ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

ES6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  ๋ฐฐํฌ์— ์ด์ƒ์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ํ™˜์˜ํ• ๋งŒํ•œ ์ถ”๊ฐ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ๋ž‘ํ•˜๊ณ  IMO๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋“ค์–ด๊ฐ€๋Š” ํ›Œ๋ฅญํ•˜๊ณ  ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ threejs๋ฅผ ๊ฐ€๋ฅด์นฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋…ธ๋“œ/npm + ํ”„๋ ˆ์ž„์›Œํฌ ์Šคํƒ์„ ๋™์‹œ์— ๋ชฉ์— ๊ฑธ์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ณธ CSS/JS/HTML์„ ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉ/์ดํ•ด๊ฐ€ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ ์ง„์ž… ์žฅ๋ฒฝ์„ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์Šคํƒ€์ผ์ ์œผ๋กœ๋„ ์ž์œ ๋กญ๊ฒŒ ๋– ๋‹ค๋‹ˆ๋Š” ์ƒˆ๋กœ์šด ๋ช…๋ช…๋œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ THREE๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์ทจํ–ฅ์ด์ง€๋งŒ.

์›ํ•˜๋Š” ์†”๋ฃจ์…˜ ์„ค๋ช…

๋ชจ๋“ˆ๋กœ๋งŒ ์ „ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด์œ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์กฐ๊ธˆ ๋” ์•Œ๊ณ  ๋‚˜๋ฉด ์ด์— ๋Œ€ํ•ด ๋” ์ž˜ ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋‹จ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์—์„œ๋Š” ES6 ๋ชจ๋“ˆ์ด ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” browserify/rollup/webpack/parcel ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚ด ์†”๋ฃจ์…˜์€ ์ž๋™ ES6 ๋ฒˆ๋“ค๋Ÿฌ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ /examples/jsm ์˜ ๋ชจ๋“ˆ์„ ํ†ตํ•ด /examples/js ๋น„ ๋ชจ๋“ˆ ๋ฒ„์ „์„ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ ๋‘ ๊ณณ์—์„œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์›ํ•˜๋Š” ๊ฒฝ์šฐ JS ๋น„ ๋ชจ๋“ˆ ๋ฒ„์ „๊ณผ ์ „์—ญ var ๊ฐ€์ ธ์˜ค๊ธฐ ์Šคํƒ€์ผ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JS ๋น„ ๋ชจ๋“ˆ ํŒŒ์ผ์˜ ์ด ์ž๋™ ์ƒ์„ฑ์€ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” package.json์˜ ๋ช…๋ น์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์ƒ์„ฑ์„ ์„ ํƒํ•˜์ง€๋งŒ.

์ด ์ž๋™ํ™”๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ JS ๋น„ ๋ชจ๋“ˆ ๋ฒ„์ „์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ES6๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋™์ผํ•œ ํ•ญ๋ชฉ์˜ ๋ณ‘๋ ฌ ๋ฒ„์ „ ๋‘ ๊ฐœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๋ฅผ ์—†์• ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์†”๋ฃจ์…˜๋„ ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ คํ•œ ๋Œ€์•ˆ์„ ๊ธฐ์ˆ ํ•˜์‹ญ์‹œ์˜ค

๋ช…๋ฐฑํ•œ ๋‹ค๋ฅธ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ JS ๋ฐ JSM ๋ฒ„์ „์„ ๊ณ„์† ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฐœํ‘œ๋ฅผ ๊ณ ๋ คํ•  ๋•Œ, ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹ค์†Œ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ˆ˜๋™์œผ๋กœ JSM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ํ•˜๋Š” ์ฑ…์ž„์„ ์ง€๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ฝ”๋“œ์—์„œ ๋˜๋Š” ๋ฌธ์ œ ๋ณด๊ณ /ํ† ๋ก ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋งŽ์€ ์‚ฌ๋ž‘์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Suggestion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์žฅ์ ๊ณผ ๋‹จ์ ์„ ๊ณต์œ ํ•ด์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ •๋ณด์— ์ž…๊ฐํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์˜ฌํ•ด์— ๋‘๋‡Œ ์ฃผ๊ธฐ์— ์†Œ๋น„ํ•œ ๊ฒƒ์ด๋ฉฐ ๋ธŒ๋ผ์šฐ์ € ๊ณต๊ธ‰์—…์ฒด์— ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด๊ธฐ๊นŒ์ง€ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ๊ณ„ํšํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ES6 ๋ชจ๋“ˆ์ด ๋ฏธ๋ž˜๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต ์—†์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋ฉด ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ์•ผ๊ธฐํ•˜๊ณ  ํ๋ฆ„์„ ์™„์ „ํžˆ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. examples/js ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์„ ๋•Œ ์ง€๋„ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์„ ๊ตฌํ˜„ํ•  ๋•Œ๊นŒ์ง€ examples/js ํด๋” ์ง€์› ์ค‘๋‹จ์„ ์ค‘๋‹จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ดˆ๋ณด์ž๊ฐ€ ์ฒซ ๋ฒˆ์งธ ํ๋ธŒ๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ํด๋ฆฌํ•„์ด๋‚˜ ๋ฒˆ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

@Bug-Reaper์™€ ๊ฐ™์€ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ examples/jsm ํŒŒ์ผ์—์„œ examples/js ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  51 ๋Œ“๊ธ€

์ „์ฒด ๋…ธ๋“œ/npm + ํ”„๋ ˆ์ž„์›Œํฌ ์Šคํƒ์„ ๋™์‹œ์— ๋ชฉ์— ๊ฑธ์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ณธ CSS/JS/HTML์„ ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ๊ธฐ์—์„œ ์ง„์ž… ์žฅ๋ฒฝ์„ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ์˜ˆ์ œ js ๋ชจ๋“ˆ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋…ธ๋“œ, npm ๋˜๋Š” ๋นŒ๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ „์—ญ ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋ฉด es6 ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ๋ฌธ๋งŒ ํ•„์š”ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ์˜ˆ์ œ js ๋ชจ๋“ˆ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋…ธ๋“œ, npm ๋˜๋Š” ๋นŒ๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ „์—ญ ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋ฉด es6 ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ๋ฌธ๋งŒ ํ•„์š”ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ฐธ์œผ๋กœ ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค!
๋‚˜๋Š” ๋ฏฟ๋Š”๋‹ค:

<script type="module">

  import { OrbitControls } from 'https://unpkg.com/three@<VERSION>/examples/jsm/controls/OrbitControls.js';

  const controls = new OrbitControls();

</script>
````
is perhaps less intuitive and harder to understand for newcomers than: 

์ž ์‹œ๋งŒ์š”... ์•„์ง ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

<script src="path/to/local/build/three.js"></script>

๋ฐ˜๋Œ€:

<script type=module src="path/to/local/build/three.module.js"></script>

์ฒซ ๋ฒˆ์งธ๋Š” ๋ˆ„๊ตฐ๊ฐ€์˜ html ๋‚ด์—์„œ ์ด์ „ ์ „์—ญ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค... ๋งž๋‚˜์š”? ES6์œผ๋กœ ์ „ํ™˜ํ•œ ํ›„ ๋” ์ด์ƒ ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์ผ์€ ๋ฌด์—‡์ด์—ˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ๊ณ„ํš์€ "/build/three.module.js" ์™ธ์— "/build/three.js"๋ฅผ ๊ณ„์† ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํƒ€๋‹นํ•œ์ง€๋Š” ์˜๋ฌธ์ž…๋‹ˆ๋‹ค. examples/js ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด three.js ๋ฐ three.min.js ๊ฐ€ ์—ฌ์ „ํžˆ ์œ ์šฉํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค.

npm ํŒจํ‚ค์ง€์˜ main ์ง„์ž…์ ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ three.js ๋ฐ three.min.js ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค(#19575 ์ฐธ์กฐ).

๊ทธ๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ ES6 ๋ฒˆ๋“ค๋Ÿฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ /examples/js๋ฅผ ๊ณ„์† ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„์ด๋””์–ด๋Š” examples/jsm ๋ฅผ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ๋ณด๋‹ค ํ˜„๋Œ€์ ์ธ JavaScript ์–ธ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. examples/js ๋Š” ์—ฌ์ „ํžˆ ์ด์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ(์˜ˆ์ œ) ๋นŒ๋“œ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ค‘๋ณต ์ฝ”๋“œ ๊ธฐ๋ฐ˜( examples/js vs examples/jsm )์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ œ ๊ด€์ ์—์„œ ์ž˜๋ชป๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ES6์—์„œ ES5๋กœ์˜ ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ถ•์†Œ ๋˜๋Š” ๊ธฐํƒ€ ๋นŒ๋“œ ๊ด€๋ จ ์ž‘์—…์—์„œ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ๊ณ„ํš์€ " /build/three.module.js " ์™ธ์— " /build/three.js "๋ฅผ ๊ณ„์† ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง„์‹ค

/examples ํด๋”์—์„œ ์ฑ„์šฐ๊ธฐ์˜ ๋ฌธ์ œ๋Š” /build/three.js ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ /examples/js $์˜ ํŒŒ์ผ์„, $ /build/three.module.js ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ /examples/jsm ์˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. /build/three.module.js , ์ผ๋ช… ๋กœ๋“œ ๋ฐฉ๋ฒ•์˜ ์ผ๊ด€์„ฑ ์œ ์ง€.

์™œ์š”? ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ธฐ๋ณธ THREE ๊ฐœ์ฒด๋Š” ๋” ์ด์ƒ ์ผ๋ฐ˜ js ๊ฐœ์ฒด THREE = {} ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ด‰์ธ๋œ(ํ™•์žฅํ•  ์ˆ˜ ์—†๋Š”) ๋‚ด๋ถ€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ชจ๋“ˆ ๊ฐœ์ฒด์ด๋ฏ€๋กœ /examples/js ์˜ ํŒŒ์ผ THREE ๊ฐœ์ฒด์— ์ƒˆ ์†์„ฑ์„ ์“ฐ๋ ค๋Š” # /examples/js ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ import * as THREE from '/build/three.module.js ์™€ THREE.WhateverExample = function() ... ๋ฅผ ํ˜ผํ•ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐ€์ ธ์˜จ lib์˜ ์ด๋ฆ„์„ THREE ์ด์™ธ์˜ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•  ์ผ๋ฐ˜ js THREE ์ „์—ญ ๊ฐœ์ฒด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค...

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด JS์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ „์—ญ ๊ณต๊ฐ„ ๋ช…๋ช…์„ ๋”๋Ÿฝํžˆ๊ณ  ๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด์— ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฆ„ ์ง€์ • ๊ถŒํ•œ์„ ์–ป๊ฒŒ ๋˜๋ฉฐ ๊ฒฐ๊ณผ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค...

์ „:

<script>
// a script you can't modify already use the name THREE
var THREE = document.getElementById('div-nb-3')
</script>

<script type="module">
import * as foo from '/build/three.module.js'

THREE.appendChild( new foo.WebGLRenderer().domElement )
</script>

@Mugen87 100% ๋งž์Šต๋‹ˆ๋‹ค. /examples/js ๋ฅผ ๋ฒ„๋ฆฌ๋ฉด three.js ๋ฐ three.min.js ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์• ๋“œ์˜จ ๋ชจ๋“ˆ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ‹ˆ์ƒˆ ์‹œ์žฅ์ด ๋  ๊ฒƒ์ด๊ณ  ์ด๊ฒƒ์€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ๊ฒƒ์ด ๊ฑฐ์˜ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

@devingfx ๋ชจ๋“ˆ์— ์žฅ์ ์ด ์žˆ๊ณ  ์ž ์žฌ์ ์ธ ์ „์—ญ ์ด๋ฆ„ ์ถฉ๋Œ์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๋ง์ด ๋งž์Šต๋‹ˆ๋‹ค. ์ˆ˜๋…„ ๋™์•ˆ ๋‚˜๋Š” THREE ์ „์—ญ ๋ณ€์ˆ˜์™€ ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์ด ์—†์—ˆ๊ณ  ์ด๊ฒƒ์ด ์žˆ์„ ๋ฒ•ํ•˜์ง€ ์•Š์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ท€ํ•˜์˜ ์š”์ ์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๋‚˜์œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ES6์—์„œ ES5๋กœ์˜ ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ถ•์†Œ ๋˜๋Š” ๊ธฐํƒ€ ๋นŒ๋“œ ๊ด€๋ จ ์ž‘์—…์—์„œ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

@ Mugen87 ๋ชจ๋“ˆ ์™ธ์— ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „ํ†ต์ ์ธ js ํฌํ•จ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ๋”์ฐํ•ฉ๋‹ˆ๊นŒ? ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋ฉฐ ๊ธฐ์กด JS ๋ฒ„์ „์ด ์ข…์ข… ๋ชจ๋“ˆ ๋ฒ„์ „๋งŒํผ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ชจ๋“ˆ์ด ์•„๋‹Œ ์ปจํ…์ŠคํŠธ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

three.module.js ๋ฐ /examples/jsm ์—์„œ three.min.js, three.js ๋ฐ /examples/js ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์„ ์ƒ์„ฑ/ํ…Œ์ŠคํŠธํ•˜๋Š” ์ผ์„ ๊ธฐ๊บผ์ด ์ฒ˜๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์›Œํฌํ”Œ๋กœ๊ฐ€ ์ˆ˜์ •๋œ ํ›„์—๋Š” ์ตœ์†Œํ•œ์˜ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ != ๋‘ ๊ฐœ์˜ ๋ณ‘๋ ฌ ๋ฒ„์ „์„ ์œ ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๋Š” ๋ชจ๋“ˆ ํŒŒ์ผ์—์„œ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋ฉฐ ๊ฐ€๋”์”ฉ๋งŒ ์ผ๋ถ€ ํŠธ๋žœ์ŠคํŒŒ์ผ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ „ํ†ต์ ์ธ ์ „์—ญ ๊ตฌ๋ฌธ์— ์˜์กดํ•˜๋Š” ์ถฉ๋ถ„ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์–ด์จŒ๋“  ๋ชจ๋“ˆ์˜ ๋ฒˆ์—ญ์„ ์ž๋™ํ™”ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ package.json์— ๋ช…๋ น์„ ํฌํ•จํ•˜๊ณ  ๋ชจ๋“ˆ์„ ์›๋ณธ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” three.min.js, three.js ๋ฐ /examples/js ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” "legacy-build"๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ํŒŒ์ผ. ์ด๋Ÿฌํ•œ ํŒŒ์ผ์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ปค๋ฐ‹ํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋ ˆ๊ฑฐ์‹œ ์ง€์›์„ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฝ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ˜„์‹ค์ ์œผ๋กœ๋Š” ์ €์žฅ์†Œ์— ๋ณด๊ด€ํ•˜๊ณ  ๋นŒ๋“œ ์‹œ ํŠธ๋žœ์ŠคํŒŒ์ผ์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

package.json์— ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๊ณ  ๋ชจ๋“ˆ์„ ๋ณ€ํ™˜ํ•˜๋Š” "legacy-build"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

ํ•ฉ๋ฆฌ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— babel์ด ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ทธ๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด, ํ•ด๋‹น ๋นŒ๋“œ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ƒˆ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ์™ธ์— ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „ํ†ต์ ์ธ js ํฌํ•จ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ๋”์ฐํ•ฉ๋‹ˆ๊นŒ?

์ด๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ณต์žก์„ฑ์ด ๊ณผ์†Œ ํ‰๊ฐ€๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ํ”„๋กœ์ ํŠธ์—์„œ ์˜ˆ์ œ๊ฐ€ ์„ค์ •๋˜๋Š” ๋ฐฉ์‹์ด ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

GLTFLoader๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋“  GLTFLoader๋Š” ๋‹จ์ผ ํŒŒ์ผ์— ํฌํ•จ๋˜์–ด ์žˆ์–ด HTML ํŒŒ์ผ ์ƒ๋‹จ์— ์‰ฝ๊ฒŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” GLTFLoader๊ฐ€ ์ข…์†์„ฑ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋” ํฐ ํŒŒ์ผ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. GLTFLoader๊ฐ€ 4๊ฐœ์˜ ์™ธ๋ถ€ ํŒŒ์ผ์— ์˜์กดํ•˜๊ณ  ๊ทธ ์ค‘ ์ผ๋ถ€๊ฐ€ ๊ณต์œ ๋˜๋ฉด ๋นŒ๋“œ๋œ ์ „์—ญ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ๋ชจ์–‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋นŒ๋“œ๋œ ์ „์—ญ ์Šคํฌ๋ฆฝํŠธ์˜ ์‚ฌ์šฉ์ž๋Š” ์ด์ œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์˜ˆ์ œ js ํŒŒ์ผ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋ชฉ๋ก๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ ํŒŒ์ผ์ด ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์œ ์ผํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์žŠ์–ด ๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ชจ๋“  ์˜ˆ์ œ js ํŒŒ์ผ์„ ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‹จ์ผ ๋ชจ๋†€๋ฆฌ์‹ blob์œผ๋กœ ๋ฌถ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฆด๋ฆฌ์Šค ๋ฐ ๋ฌธ์„œ ์˜ค๋ฒ„ํ—ค๋“œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๊ธฐ์กด js ํŒŒ์ผ์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋กค์—… ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ๊ณ„ํš์€ "/build/three.module.js" ์™ธ์— "/build/three.js"๋ฅผ ๊ณ„์† ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํƒ€๋‹นํ•œ์ง€๋Š” ์˜๋ฌธ์ž…๋‹ˆ๋‹ค.
examples/js๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด three.js ๋ฐ three.min.js๊ฐ€ ์—ฌ์ „ํžˆ ์œ ์šฉํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค.

@Mugen87 @mrdoob

๋‚จ์ž ์ด๋ฆ„,
์‚ฌ์‹ค "three.min.js"๋ฅผ ์ตœ์†Œ 2๋…„ ๋” ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
๋‚ด ๋ชจ๋“  ์ƒ˜ํ”Œ์ด ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒŒ์ผ๊ณผ Google ์ตœ๊ณ ์˜ ๊ฐœ๊ฐ€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!
์˜ˆ: https://www.google.com/search?source=hp&q=webgl+benchmark

๋ฐ˜๋ฉด์— "three.min.js"๋Š” ๋” ๋น ๋ฅธ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์˜คํ”„๋ผ์ธ์—์„œ ์ž‘๋™ํ•˜๊ณ  localhost๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ํŒŒ์ผ์„ ํด๋” ์–ด๋”˜๊ฐ€์— ๋„ฃ๊ณ  Firefox๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML ํŒŒ์ผ์„ ๋‘ ๋ฒˆ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค.
๋‚˜๋Š” ํ•ญ์ƒ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค!

Ricardo๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฑด๋ฐฐ

three.js ๋ฐ three.min.js ์ œ๊ฑฐ๋Š” examples/js ๊ฐ€ ์—†์–ด์กŒ์„ ๋•Œ ๋…ผ์˜ํ•˜๊ณ  ๊ณ„ํšํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ด์ƒ examples/js ์—์„œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์„ ๋•Œ ์ค‘์š”์„ฑ์ด ์ƒ์‹ค๋˜์—ˆ์Œ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ณต์žก์„ฑ์ด ๊ณผ์†Œ ํ‰๊ฐ€๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ํ”„๋กœ์ ํŠธ์—์„œ ์˜ˆ์ œ๊ฐ€ ์„ค์ •๋˜๋Š” ๋ฐฉ์‹์ด ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ๊ธฐํ•˜๋Š” ํฌ์ธํŠธ๋ฅผ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋ง์—๋Š” ์ „ํ˜€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ณต์žก์„ฑ์ด ์žˆ์œผ๋ฉฐ ์ค‘์ฒฉ ๋ชจ๋“ˆ์˜ ์˜ˆ๊ฐ€ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์š”์ ์— ๋”ฐ๋ฅด๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ทธ ๋•Œ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ์ค‘์ฒฉ ๋ชจ๋“ˆ์„ ๋ฌถ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•ฉ๋ฆฌ์ ์ธ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ทธ๊ฒƒ์„ ์„ค์ •ํ•˜๊ณ  ์ƒํ™ฉ์„ ์žŠ์–ด ๋ฒ„๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ง€ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ๋‚ฎ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์šด ์‹œ๊ธฐ๊ฐ€ ๋˜๋ฉด ์–ธ์ œ๋“ ์ง€ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์‹œ๋„๋ฅผ ํ• ์ธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. /examples/jsm ๊ณผ examples/js ์‚ฌ์ด์— ์—ฌ์ „ํžˆ 1:1 ํŒจ๋ฆฌํ‹ฐ๊ฐ€ ์žˆ๋Š” ๋™์•ˆ ์ง€๊ธˆ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. /example/jsm ๋ชจ๋“ˆ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋Œ€๋Œ€์ ์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•  ๋•Œ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ณ„์†ํ•ด์„œ ๊ทธ๋“ค์ด ๋งํ•˜๋Š” ๋Œ€๋กœ ๋‚ด ์ž…์ด ์žˆ๋Š” ๊ณณ์— ๋‚ด ๋ˆ์„ ๋‘๊ธฐ ์œ„ํ•ด (์ด๋ฏธ ์ถ”๊ฐ€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— babel์„ ์‚ฌ์šฉํ•˜์—ฌ) ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ž‘์—… ์ฆ๋ช… ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Mugen์˜ ์š”์ ์— ๋”ฐ๋ฅด๋ฉด, ์ด๋Š” three.js ๋ฐ three.min.js ์— ๋Œ€ํ•œ ๊ด€๋ จ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋™์‹œ์— ๊ณ„์† ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋น„ ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ THREE ๊ตฌํ˜„๊ณผ ํ˜ธํ™˜๋˜๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์ฐพ๊ณ  ์žˆ๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์‚ฌ์ดํŠธ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ THREE ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌํŒฉํ† ๋ง์€ ์ˆ˜ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์•Œ๊ณ  ์žˆ๋”๋ผ๋„ ์ƒ๋‹นํžˆ ๊ด‘๋ฒ”์œ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ณต๋™ ์ž‘์—…์ž์— ๋Œ€ํ•ด ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋งˆ์Œ์„ ๋ฐ”๊พธ์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ #18749์—์„œ ๋…ผ์˜๋˜๊ณ  ์ปค๋ฐ‹๋œ ๋Œ€๋กœ 2020๋…„ 12์›” ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ examples/js ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐ ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ #18749์—์„œ ๋…ผ์˜๋˜๊ณ  ์ปค๋ฐ‹๋œ ๋Œ€๋กœ 2020๋…„ 12์›” ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ examples/js๋ฅผ ์‚ญ์ œํ•˜๊ธฐ๋กœ ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
"three.min.js"๋ฅผ ๋ช‡ ๋…„ ๋” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ...

Mugen ์ž…๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ ๊ฒฐ์ •์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์•„๋‹ˆ๋ผ ๋ฐœํ‘œ์— ๋” ๊ฐ€๊นŒ์šด ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ฐ€์ •์€ ๋‹จ์ˆœํ™”๋œ ๊ฐœ๋ฐœ์ด ์ด ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ์ฃผ๋œ ์ด์œ ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

/examples/js ์Šคํƒ€์ผ ํฌํ•จ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€ํ™˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์—์„œ ์ ์ ˆํ•œ ์ ˆ์ถฉ์•ˆ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ํ•„์š”ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ/๋ณต์žกํ™”์˜ ์–‘์„ ํฌ๊ฒŒ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” package.json์˜ ๋ช…๋ น์ด๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํŠธ๋žœ์ŠคํŒŒ์ผํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž์™€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๋™ ์ž‘์—…์„ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋ณ„๋„๋กœ ๋ฒˆ์—ญ/๋ฒˆ๋“ค ์›Œํฌํ”Œ๋กœ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. :)

๋‚˜๋Š” ๊ทธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ ๊ฒฐ์ •์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ๋ฐœํ‘œ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋ชจ๋“  ์œ ํšจํ•œ ์ฃผ์žฅ์„ ๋‹จ์ผ ์Šค๋ ˆ๋“œ์— ๊ณ ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ๋ณ€๊ฒฝ์˜ ์‹คํ˜„์ด ์ˆ˜๋…„์— ๊ฑธ์ณ ์—ฌ๋Ÿฌ ๋…ผ์˜์—์„œ ์ฒœ์ฒœํžˆ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ๋™์ผํ•œ ์ฃผ์ œ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์˜ˆ: ). ๊ณต๋™ ์ž‘์—…์ž๋Š” ๋…ธ์ด์ฆˆ์™€ ์„ธ๋ถ„ํ™”๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์ง€๋งŒ ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด ๊ฐ€์ •์€ ๋‹จ์ˆœํ™”๋œ ๊ฐœ๋ฐœ์ด ์ด ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ์ฃผ๋œ ์ด์œ ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ๋ณธ ๊ฐ€์žฅ ํฐ ๊ฒƒ์€ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„์„ ๋งŒ๋“œ๋Š” ํ•˜์œ„ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€๋ถ€๋ถ„์˜ ๋กœ๋”๋Š” ์ผ์ข…์˜ ๋ฐ์ดํ„ฐ ๊ตฌ๋ฌธ ๋ถ„์„ ๊ตฌ์กฐ/ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ๋กœ๋”๊ฐ€ example/js ํŒŒ์ผ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž๊ธ‰์ž์กฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋น„ ๋ชจ๋“ˆ์‹ ์ œํ•œ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋ฉด DataParser ํด๋ž˜์Šค์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋ชจ๋“  ๋กœ๋”์—์„œ ํ•ด๋‹น ํ‘œ์ค€ ๊ตฌํ˜„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ด ์ฆ‰์‹œ ์‰ฌ์›Œ์ง€๊ณ  ์ค‘๋ณต ์ฝ”๋“œ๋„ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋กœ๋”.

๋„ค, ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ Pass ํด๋ž˜์Šค(๋ชจ๋“  FX ํŒจ์Šค์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค)๋ฅผ EffectComposer ์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋”๋Ÿฌ์šด ํ•ดํ‚น์„ ๋งŒ๋“ค์–ด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„์ฃผ ์ข‹์€ ์ ๋“ค์ด ๋‘๋ฃจ๋‘๋ฃจ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์„ ์ถ”์ /์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ  ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ (๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด) ์–ด๋ ค์šด ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐ์„ ์ข€ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค "three.min.js"๋ฅผ ์ตœ์†Œ 2๋…„ ๋” ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ES5 ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ๋Œ€๋‹ตํ•ด์•ผ ํ•  ์งˆ๋ฌธ์€ ์ด์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์šฐ๋ฆฌ์—๊ฒŒ ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด three.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์žˆ๋Š”์ง€์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ ํŒŒ์ผ์˜ ES5 ๋ฒ„์ „์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ๋‹ค๊ณ  ์ด๋ฏธ ๊ฒฐ์ •ํ–ˆ์œผ๋ฏ€๋กœ ๋นŒ๋“œ ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์—๋Š” ๊ฐ„๊ฒฉ์„ ๋‘๋Š” ๊ฒƒ๋ณด๋‹ค ํ•œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฑธ์ณ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด์ง€๋งŒ three.min.js๋ฅผ ์กฐ๊ธˆ ๋” ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒŒ์ผ๊ณผ Google ์ตœ๊ณ ์˜ ๊ฐœ๊ฐ€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!
์˜ˆ: google.com/search?source=hp&q=webgl+benchmark

์ด๊ฒƒ์€ ๊ทธ ๊ฒ€์ƒ‰์—์„œ ๋‚˜์—๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ์ตœ์ƒ์œ„ ์‚ฌ์ดํŠธ์ด๊ณ  ๊ทธ๋“ค์€ R53์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ณ€๊ฒฝ์ด ๊ทธ๋“ค์—๊ฒŒ ๋„ˆ๋ฌด ๋‚˜์œ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: https://www.wirple.com/bmark/

๋ณด์‹œ๋‹ค์‹œํ”ผ, three.js์˜ ์ด์ „ ๋ฒ„์ „์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ๋กœ ์ „ํ™˜ํ•œ ํ›„ Babel์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ES5 ๋นŒ๋“œ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ES5 ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์ „์˜ ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํ•ด๋‹น ๋ฆด๋ฆฌ์Šค์˜ ์ „์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ๋ฒ„์ „์˜ ๋ฌธ์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@looeeee ์ข‹์€ ์ ์„ ๋งŒ์ง€์…จ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์—ฌ๊ธฐ์—์„œ ES5 three.min.js ๋ฐ three.js ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ ์ž์‹ ์˜ ๋ณ„๋„ ํ† ๋ก ์ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์–ด๋Š ์ชฝ์ด๋“  ๋‚˜๋Š” ๊ตฌ์‹ ES5 ์Šคํƒ€์ผ /js/example ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์ €์žฅ์†Œ์— babel ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์ง€์›์„ ์ œ๊ณตํ•  ์ฑ…์ž„์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ €์ฒ˜๋Ÿผ ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๊ธฐ์—ฌ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํŠธ๋žœ์ŠคํŒŒ์ผํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž์™€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๋™ ์ž‘์—…์„ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋ณ„๋„๋กœ ๋ฒˆ์—ญ/๋ฒˆ๋“ค ์›Œํฌํ”Œ๋กœ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ babel ES6์—์„œ ES5 ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ์Šคํฌ๋ฆฝํŠธ๋กœ ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ณต์ •ํ•œ ํƒ€ํ˜‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ์ •๋ง ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ๊ณ ์ž๊ฐ€ ๊ธฐ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ˜‘๋ ฅ์ž์—๊ฒŒ ๋„์›€์ด๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด ๋‹ฌ๋ผ๋Š” ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์œ„ํ•ด PR์„ ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋‹น์‹ ์€ ์ •๋ง๋กœ ๊ทธ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด ํˆฌํ‘œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•œ PR์„ ๋งŒ๋“ค๊ณ  ์ž‘๋™ํ•œ๋‹ค๋ฉด

๋‚ด ๋ง์€, ์ด๊ฒƒ์ด ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค

๋‹น์‹ ์€ ์ •๋ง๋กœ ๊ทธ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด ํˆฌํ‘œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฆฐํŒ… ํŒจ์Šค์— ์‹คํŒจํ•˜๋ฉด ๋ชจ๋“  ๋ฒ ํŒ…์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค ๐Ÿ˜‚

๊ฑฐ๊ธฐ์— ์ •๋ง ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ €์žฅ์†Œ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋”ฉ ํŒจํ„ด์„ ํ™๋ณดํ•ด์„œ๋Š” ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ €์žฅ์†Œ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋”ฉ ํŒจํ„ด์„ ํ™๋ณดํ•ด์„œ๋Š” ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

three.js + three.min.js (ITT๋Š” ์šฐ๋ฆฌ๋„ ๊ทธ๊ฒƒ๋“ค์„ ํ•ด๊ณ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ•ฉ์˜๋ฅผ ์ธ์ •ํ•จ)๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” babel ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต์‹์ ์œผ๋กœ ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋น›๋‚˜๋Š” ์ง€์ง€. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด ๋Œ€์‹  ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ™•์‹คํžˆ ๊ถŒ์žฅํ•˜๊ณ  babel ์Šคํฌ๋ฆฝํŠธ์™€ ์ด์— ๋Œ€ํ•ด ์ƒ์„ฑ๋œ ํŒŒ์ผ์— ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ธฐ์—ฌ์ž๋“ค์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋”ฉ ํŒจํ„ด์„ ์กฐ์žฅํ•˜๋Š” ์ด์œ ๋กœ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ํ•จ๊ป˜ babel ์Šคํฌ๋ฆฝํŠธ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๋น„์‹ค์šฉ์ ์ธ ์ƒํ™ฉ์ด ์—ฌ์ „ํžˆ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ์ด๋Ÿฌํ•œ ํ•„์š”์„ฑ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•จ๊ป˜ ์ž‘์—…ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ES5 three.min.js์™€ three.js๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” examples/js, three.min.js, three.js๋ฅผ ๋™์‹œ์— ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์—ฌ๋Ÿฌ ๋ฆด๋ฆฌ์Šค์— ํผ๋œจ๋ฆฌ๊ธฐ๋ณด๋‹ค ํ•œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋ชจ๋“  ES5 ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@๋ฌด๊ฒ87

์˜ˆ, ์ €์žฅ์†Œ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋”ฉ ํŒจํ„ด์„ ํ™๋ณดํ•ด์„œ๋Š” ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Windows 10์—์„œ DOS ๊ฒŒ์ž„์„ ๊ณ„์† ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ Microsoft๊ฐ€ "์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋”ฉ ํŒจํ„ด"์„ ํ™๋ณดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ์˜ˆ์ œ js ๋ชจ๋“ˆ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋…ธ๋“œ, npm ๋˜๋Š” ๋นŒ๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ๋ฌถ๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋ง์ž :)

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Rollup๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค ๋„๊ตฌ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๋•์…˜์—์„œ THREE๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๋Ÿฌํ•œ ๋ฒˆ๋“ค ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ณต์ •ํ•ฉ๋‹ˆ๊นŒ?
  • examples ํด๋”์—์„œ ES5/UMD ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์ด ๊ณต์ •ํ•ฉ๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ๋Š๋‚Œ:

์ด ๋„์„œ๊ด€์€ 10๋…„์ด ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค. ES5/UMD๋กœ ์ž‘์„ฑ๋œ examples ํด๋”์˜ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ƒํƒœ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์€ ๊ณต์ •ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง ํŒจํ„ด ์—†์ด ES6์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์ผ ES6์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ ๋งค์šฐ ๋งž์ถคํ™”๋˜๊ณ  ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง ํŒจํ„ด์„ ํ†ตํ•ฉํ•  ์ˆ˜ ์—†๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ƒ์ ์—์„œ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ฐ ๋ฆด๋ฆฌ์Šค ์ดํ›„์— ์ฃผ์–ด์ง„ ๋ฐฐํฌ์— ๋Œ€ํ•ด ES6 ๋ชจ๋“ˆ์„ ES5/UMD ๋ชจ๋“ˆ๋กœ ์ปดํŒŒ์ผํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ €์žฅ์†Œ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋”ฉ ํŒจํ„ด์„ ํ™๋ณดํ•ด์„œ๋Š” ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์‚ถ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์†”๋ฃจ์…˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ค๋ž˜๋œ ํŒจํ„ด, ๊ธฐ์ˆ  ๋ฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ์ˆ˜ํ•œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด - ์—ฌ๊ฐ€ ์‹œ๊ฐ„์—๋Š” ํฌ์ธํŠธ ๋Œ๋กœ ๋Œ ์กฐ๊ฐ์„ ์ฆ๊น๋‹ˆ๋‹ค. ๋„๊ตฌ์™€ ๊ธฐ์ˆ ์€ ์ „๋™ ๊ณต๊ตฌ์™€ ๋‹ค๋ฅด์ง€๋งŒ ๊ฒฐ๊ตญ ์กฐ๊ฐํ’ˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ณ ํ’ˆ์งˆ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํฌ์ธํŠธ ๋Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๊ณ  ๋‚˜ ์ž์‹ ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งŒ์กฑํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ์ˆ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ์ธํŠธ ๋Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ฐœ์ธ์ ์œผ๋กœ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค.

ES5/UMD ๋ชจ๋“ˆ์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ •๋ง ๊ณ ํ’ˆ์งˆ์˜ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ์œ ์ง€ํ•˜๋Š” ํŒจํ„ด, ๊ธฐ์ˆ  ๋ฐ ๋„๊ตฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๊ณ  ๊ณ„์†ํ•ด์„œ ๊ฐœ์ธ ์ทจํ–ฅ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ฆด๋ฆฌ์Šค ์ดํ›„์— ์ฃผ์–ด์ง„ ๋ฐฐํฌ์— ๋Œ€ํ•ด ES6 ๋ชจ๋“ˆ์„ ES5/UMD ๋ชจ๋“ˆ๋กœ ์ปดํŒŒ์ผํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

looee๋‹˜ ๋ง์”€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ณต์ •ํ•ฉ๋‹ˆ๊นŒ [...]

๋ญ๋ผ๊ณ  ์š”? ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. '๊ฐ€์ •'์€ ๋‚˜์ค‘์— ์˜ต๋‹ˆ๋‹ค. ์„ ํ˜ธ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ(์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ค๋ž˜๋œ 3๊ฐœ๋ฅผ ์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •) ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๋ฆด๋ฆฌ์Šค ์ดํ›„์— ์ฃผ์–ด์ง„ ๋ฐฐํฌ์— ๋Œ€ํ•ด ES6 ๋ชจ๋“ˆ์„ ES5/UMD ๋ชจ๋“ˆ๋กœ ์ปดํŒŒ์ผํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ˆ„๊ตฌ๋‚˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋น„์šฉ์€ three.js ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ถ€๋‹ดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ @gkjohnson ์ด ๋งํ•œ ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค examples/js ๋ฐ examples/jsm ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋น„์šฉ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋ฌด๊ธฐํ•œ์œผ๋กœ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ES6 ๋ชจ๋“ˆ์ด ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ ์ค‘ ๋” ํ˜„๋Œ€์ ์ด๋ผ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋น„์šฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

  • ์ž๋™ํ™” ์ƒ์„ฑ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ
  • ์ž๋™ํ™” ์ค‘๋‹จ ์‹œ ๋ฆด๋ฆฌ์Šค ์‹คํŒจ ๋””๋ฒ„๊น…
  • ๋ชจ๋“  ํ’€ ์š”์ฒญ์ด ์ƒ์„ฑ๋œ ํŒŒ์ผ์ด ์•„๋‹Œ ์†Œ์Šค ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ์›Œํฌํ”Œ๋กœ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ ์œ ์ง€ ๊ด€๋ฆฌ
  • CJS ๋ฐ ES6 ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž์˜ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ ๋ฐ ์ง€์› ์งˆ๋ฌธ์— ๋‹ต๋ณ€

๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด ์•„๋งˆ๋„ ๊ฐ€์žฅ ํด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๋‘ ๊ฐœ์˜ ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๋‘˜ ๋‹ค ์™„์ „ํžˆ ์ง€์›๋˜๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ž‘์—… ํ๋ฆ„์„ ํ˜ผ๋™ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹คํŒจํ•˜๋Š” CJS ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ES6 ๋ชจ๋“ˆ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์ •๊ธฐ์ ์œผ๋กœ ์‹œ๊ฐ„์„ ํ• ์• ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ”๊ฟ” ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. three.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ค‘์š”ํ•˜์ง€๋งŒ ์„ ํƒ์ ์ธ ๋ถ€๋ถ„์ธ ๋ชจ๋“  ์˜ˆ์ œ๋Š” ํ˜„์žฌ ๋ชจ๋“ˆ ๊ตฌ๋ฌธ์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UMD๋„ ์•„๋‹ˆ๊ณ  CommonJS๋„ ์•„๋‹ˆ๊ณ  ES6 ๋ชจ๋“ˆ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹จ์ˆœํžˆ THREE ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ES6 ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์ด ๊ณ„ํš๋˜์—ˆ๋‹ค๋Š” ์กฐ๊ธฐ ๊ฒฝ๊ณ ๊ฐ€ ๋งŽ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ES5/UMD๋กœ ์ž‘์„ฑ๋œ examples ํด๋”์˜ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ƒํƒœ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์€ ๊ณต์ •ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

three.js ์ƒํƒœ๊ณ„์˜ ์–ด๋–ค ๊ฒƒ๋„ ๊ธ€๋กœ๋ฒŒ THREE.* ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋„ˆ๋ฌด ์˜์กด์ ์ด์–ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ES5๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ณต์ •ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ํ•ฉํ•œ ์˜ต์…˜์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

examples/js ๋ฐ examples/jsm ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋น„์šฉ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ํŒŒ๊ณ ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋งŽ์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ”„๋ก ํŠธ ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์œผ๋กœ ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž๋™ํ™” ์ƒ์„ฑ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ
์ž๋™ํ™” ์ค‘๋‹จ ์‹œ ๋ฆด๋ฆฌ์Šค ์‹คํŒจ ๋””๋ฒ„๊น…

์œ ์ง€์„ธ๋ฅผ ์กฐ๊ธˆ ๋” ์ดํ•ดํ•˜๋„๋ก ๋„์™€์ฃผ์„ธ์š”. ์ด๊ฒƒ์€ THREE ์ฝ”๋“œ๋ฒ ์ด์Šค๋งŒ์˜ ๊ณ ์œ ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฐ€์žฅ ์˜ค๋ž˜ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ํ•œ ๋ฒˆ ์ž‘์„ฑํ•˜๊ณ  ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค์‹œ ๋ณด์ง€ ์•Š๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ํ’€ ์š”์ฒญ์ด ์ƒ์„ฑ๋œ ํŒŒ์ผ์ด ์•„๋‹Œ ์†Œ์Šค ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค ์›Œํฌํ”Œ๋กœ์—์„œ ์ž‘์€ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ์›Œํฌํ”Œ๋กœ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ ์œ ์ง€ ๊ด€๋ฆฌ

๋‚˜๋Š” ๋˜ํ•œ ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐ ํˆฌํ‘œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์›Œํฌํ”Œ๋กœ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ UMD/ES6 ๋ชจ๋“ˆ์—๋Š” ๋ฌธ์„œ ์„ธํŠธ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

CJS ๋ฐ ES6 ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž์˜ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ ๋ฐ ์ง€์› ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ด€๋ จ๋œ ์ด์Šˆ์˜ ์–‘์€ THREE์˜ ์ธ๊ธฐ์— ๋น„๋ก€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ๊ณผ ๋‚˜๋Š” ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์—์„œ ํ•ญ์ƒ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ฅผ ๋ด…๋‹ˆ๋‹ค. ๋‘ ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์˜๊ฐ์„ ์–ป์€ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋จธ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ชฉํ‘œ๊ฐ€ ํŠนํžˆ ๋‘ ์›Œํฌํ”Œ๋กœ ๊ฐ„์˜ ํ˜ผ๋™๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ ์˜ ์–‘์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋ผ๋ฉด ES5 ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „๋ฐ˜์ ์ธ ๋ฌธ์ œ์˜ ์–‘์ด ๋ฐ”๋€”์ง€๋Š” ์˜๋ฌธ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ•ญ์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ด€๋ จ๋˜๊ฑฐ๋‚˜ ๊ด€๋ จ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ์งˆ๋ฌธ์— ๊ฐ‡ํž ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ „์ฒด ๋ฌธ์ œ์˜ ์–‘์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‹ค์ œ ๋ชฉํ‘œ๊ฐ€ ์ „์ฒด ๋ฌธ์ œ์˜ ์–‘ ์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๋ณด๋‹ค ์—„๊ฒฉํ•œ ๋ฌธ์ œ ์ •์ฑ…์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ Help (please use the forum) ์™€ ๊ฐ™์€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ•ญ๋ชฉ์ด ๋” ๋งŽ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ 3๋ช…์˜ ๊ธฐ์—ฌ์ž๊ฐ€ ํ˜„์žฌ ์ „์ฒด ๋ณผ๋ฅจ์— ์••๋„๋˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋…ผ์˜ํ•˜๊ณ  ์กฐ์‚ฌํ•˜๋ ค๋Š” ๋ช‡ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ฌธ์ œ ๋ฒ”์œ„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด:

  • suggestions ๋ฐ enhancements ์ž‘์„ฑ ๋‹น์‹œ (271)๊ฐœ์˜ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ ˆ์ด๋ธ”์€ ๋งŽ์€ ์†Œ์Œ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ œ์•ˆ์œผ๋กœ ์ „๋‹ฌ๋œ PR ์ค€๋น„/ํ™•์ธ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ์ธ์Šคํƒ€ ๋‹ซ๊ณ  Discussion (please use the forum) ๋กœ ํ‘œ์‹œํ•˜์‹ญ์‹œ์˜ค.
  • loaders ์ž‘์„ฑ ๋‹น์‹œ (61) ๊ฐœ์˜ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ ˆ์ด๋ธ”๋„ ๋งŽ์€ ์†Œ์Œ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. suggestions ๋ฐ enhancements ๋˜๋Š” ์ž˜๋ชป๋œ ํ˜•์‹์˜ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์™€ ๊ด€๋ จ๋œ ์ด ๋ ˆ์ด๋ธ”์— ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ž˜ ๊ตฌ์„ฑ๋œ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์™€ PR ์ค€๋น„/์ œ์•ˆ์„ ์œ„ํ•ด ํ†ต๊ณผ๋œ ๊ฒ€์‚ฌ๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ์ธ์Šคํƒ€ ๋‹ซ๊ณ  ๊ทธ์— ๋”ฐ๋ผ ํ‘œ์‹œํ•˜์‹ญ์‹œ์˜ค.

three.js ์ƒํƒœ๊ณ„์˜ ๋ชจ๋“  ๊ฒƒ์ด ๊ธ€๋กœ๋ฒŒ THREE.* ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋„ˆ๋ฌด ์˜์กด์ ์ด์–ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ES5๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฒˆ๋“ค๋Ÿฌ.

๋ฌด์—‡์ด๋“  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—๋Š” ๋™์˜ํ•˜์ง€๋งŒ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๊ณ„์† ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด @Bug-Reaper๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•˜๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ณต๋™ ์ž‘์—…์„ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋ณ„๋„๋กœ ๋ฒˆ์—ญ/๋ฒˆ๋“ค ์›Œํฌํ”Œ๋กœ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž๋“ค์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ์‹œ์Šคํ…œ ๋ฐ ๋ฌธ์„œ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋“œ๋Š” ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์„ ์ง‘ํ•ฉ์ ์œผ๋กœ ์ ˆ์•ฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ํŒŒ๊ณ ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋งŽ์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ”„๋ก ํŠธ ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์œผ๋กœ ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ข‹์€.

์ „์ฒด ๋ฌธ์ œ์˜ ์–‘์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ณ„์† ์ง„ํ–‰ํ•ด ์ฃผ์„ธ์š”. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋” ๋…ผ์˜ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹ค์†Œ ๋‚ด ์ด์ „ ์˜๊ฒฌ ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @Bug-Reaper์˜ ๋ง์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋ฒˆ์—ญ/๋ฒˆ๋“ค ์›Œํฌํ”Œ๋กœ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. [...]

๋‚˜๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์ด๊ฒƒ์— ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ ๊ณผ ๋‹จ์ ์„ ๊ณต์œ ํ•ด์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ •๋ณด์— ์ž…๊ฐํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์˜ฌํ•ด์— ๋‘๋‡Œ ์ฃผ๊ธฐ์— ์†Œ๋น„ํ•œ ๊ฒƒ์ด๋ฉฐ ๋ธŒ๋ผ์šฐ์ € ๊ณต๊ธ‰์—…์ฒด์— ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด๊ธฐ๊นŒ์ง€ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ๊ณ„ํšํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ES6 ๋ชจ๋“ˆ์ด ๋ฏธ๋ž˜๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต ์—†์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋ฉด ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ์•ผ๊ธฐํ•˜๊ณ  ํ๋ฆ„์„ ์™„์ „ํžˆ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. examples/js ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์„ ๋•Œ ์ง€๋„ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์„ ๊ตฌํ˜„ํ•  ๋•Œ๊นŒ์ง€ examples/js ํด๋” ์ง€์› ์ค‘๋‹จ์„ ์ค‘๋‹จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ดˆ๋ณด์ž๊ฐ€ ์ฒซ ๋ฒˆ์งธ ํ๋ธŒ๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ํด๋ฆฌํ•„์ด๋‚˜ ๋ฒˆ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

@Bug-Reaper์™€ ๊ฐ™์€ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ examples/jsm ํŒŒ์ผ์—์„œ examples/js ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@mrdoob

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์„ ๊ตฌํ˜„ํ•  ๋•Œ๊นŒ์ง€ examples/js ํด๋” ์ง€์› ์ค‘๋‹จ์„ ์ค‘๋‹จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
@Bug-Reaper์™€ ๊ฐ™์€ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ examples/jsm ํŒŒ์ผ์—์„œ examples/js๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„๋ช…ํ•œ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.
๐Ÿ‘

@mrdoob ๋ฌผ๋ก  ๋‹น์‹ ์˜ ๊ฒฐ์ •์„ ๋ฐ›์•„๋“ค์ด์ง€๋งŒ ๊ธฐํšŒ๋ฅผ ๋†“์นœ ๊ฒƒ ๊ฐ™์•„์š”. ์กฐ๋งŒ๊ฐ„ ๊ฐœ๋ฐœ์ž๋Š” ๊ธ€๋กœ๋ฒŒ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฉ€์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Import Maps ๊ฐ€ ์—ฌ๊ธฐ์„œ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋ฅผ ๋” ๋‚˜์€ ๋ฏธ๋ž˜ ๋ณด์žฅํ˜• ์›Œํฌํ”Œ๋กœ๋กœ "๊ฐ•์ œ"ํ•˜๋Š” ๋Œ€์‹  ๊ธ€๋กœ๋ฒŒ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2020๋…„.

๊ทธ๋ฆฌ๊ณ  Import Maps ๊ฐ€ ์—ฌ๊ธฐ์„œ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋‚  ๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

<script src="js/three.js"></script>
<script src="https://cdn.rawgit.com/mrdoob/three.js/master/examples/js/loaders/GLTFLoader.js"></script>
<script type="module" src="js/main.js"></script>

๊ทธ๋ฆฌ๊ณ  main.js ๋‚ด๋ถ€์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.

import {OrbitControls} from "https://threejsfundamentals.org/threejs/resources/threejs/r119/examples/jsm/controls/OrbitControls.js";

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์€... ๐Ÿ˜

์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํ•™์Šตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ž‘๋™ํ•  ๋•Œ๊นŒ์ง€ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ๋“ค์ด ๊นจ๋‹ซ์ง€ ๋ชปํ•˜๋Š” ์‚ฌ์ด์— ์˜ณ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋””์ž์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์ด ์—†๋Š” ES6 ๋ชจ๋“ˆ์˜ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ OrbitControls.js ๋ฅผ ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š” /js ํด๋”์— ๋ณต์‚ฌํ•˜๊ณ  ์ด์ „์ฒ˜๋Ÿผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. OrbitControls.js ๊ฐ€ ../../build/three.module.js ๋ฅผ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์„ ์‚ฌ์šฉํ•˜๋ฉด OrbitControls.js ๋Š” three ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์›ํ•˜๋Š” ์œ„์น˜์— ํŒŒ์ผ์„ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์—์„œ ๊ฒฝ๋กœ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์„ ์‚ฌ์šฉํ•˜๋ฉด "์˜›๋‚ "๊ณผ ๊ฐ™์ด ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „๋งŒํผ ์‰ฝ์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ ์ตœ์†Œํ•œ ์‚ฌ์šฉ์ž๋Š” ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์ˆœ์„œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌด์–ธ๊ฐ€๋ฅผ ์ด๊ธฐ๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ์žƒ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ๋”ฐ๋ผ์„œ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์—ฌ์ „ํžˆ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์„ ์กฐ์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ(๋”ฐ๋ผ์„œ ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

์ €๋Š” "JS ํŒŒ์ผ์„ ํด๋”์— ๋ณต์‚ฌ" ์ „์ฒด๊ฐ€ ์‚ฌ์•…ํ•œ ์•ˆํ‹ฐ ํŒจํ„ด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž/์ดˆ๋ณด์ž์—๊ฒŒ CDN ๊ฐ€์ ธ์˜ค๊ธฐ ์ž‘์—…์„ ๊ถŒ์žฅํ•˜์—ฌ ์ด๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ๋“  ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.) ์ ์ ˆํ•œ ์•ฑ์€ ์–ด์จŒ๋“  ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •๋ง๋กœ ์•ˆํ‹ฐ ํŒจํ„ด์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šด ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์„ /css ํด๋”์— ๋„ฃ์€ ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ /img ์—, .js ํŒŒ์ผ์„ /js ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ๋‚˜๋Š” ES6 Modules/CDN ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜ ์„ ํ–ˆ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‚ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ๊ณณ๊ณผ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ์˜จ ๊ฒƒ์ด ๊ธฐ๋ถ„์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์„ ๋•Œ ํ•œ ๊ฐ€์ง€ ํฐ ์†์‹ค์€ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. examples/js ์˜ ํŒŒ์ผ์€ ํ•ญ์ƒ ๊ทธ ์œ„์— ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ œ์—ฌ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ OrbitControls.js ๋ฅผ ๋ณต์‚ฌํ–ˆ๋Š”๋ฐ ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋กœ์ปฌ ํŒŒ์ผ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

<script src="js/libs/three.js"></script>
<script src="js/libs/three/OBJLoader.js"></script>
<script src="js/libs/three/OrbitControls.js"></script>
<script>
    console.log( THREE, THREE.OBJLoader, THREE.OrbitControls );
</script>

๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

<script type="importmap">
{
  "imports": {
    "three": "js/libs/three.module.js",
    "OBJLoader": "js/libs/three/OBJLoader.js",
    "OrbitControls": "js/libs/three/OrbitControls.js"
  }
}
</script>
<script type="module">
    import * as THREE from 'three';
    import { OBJLoader } from 'OBJLoader';
    import { OrbitControls } from 'OrbitControls';

    console.log( THREE, OBJLoader, OrbitControls );
</script>

์˜ˆ์ „๋งŒํผ ์˜ˆ์˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ ์ข…์†์„ฑ/์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฒˆ๋“ค ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์—ฌ์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์• ๋“œ์˜จ์ด ์ด์ œ ../../build/three.module.js three ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์€... ๐Ÿ˜

FWIW ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์†Œ๋Ÿ‰์˜ ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฐฉ์‹์œผ๋กœ ์‹คํŒจํ•˜๊ณ  ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ๋„ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฑฑ์ •๋œ๋‹ค๋ฉด ํ‹€๋ฆผ์—†์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ ‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ˜์†”์˜ ๊ฒฝ๊ณ ๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€์— ๋‘ ๊ฐœ์˜ three.js ์‚ฌ๋ณธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Œ์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋™์ผํ•œ ๋ฒ„์ „์ผ์ง€๋ผ๋„). ํ˜ผํ•ฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ~๋‚˜๋Š” React๊ฐ€ ๋น„์Šทํ•œ ์ด์œ ๋กœ ์ด๊ฒƒ์„ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค~ React๋Š” ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ์˜ค๋ฅ˜์˜ ๊ฐ€๋Šฅํ•œ ์†Œ์Šค๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•™์Šตํ•  ๋•Œ ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ์–‘์‹์„ ํ˜ผํ•ฉํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐ ์ตœ์†Œํ•œ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Bug-Reaper์™€ ๊ฐ™์€ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ examples/jsm ํŒŒ์ผ์—์„œ examples/js๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ƒˆ๋กœ์šด ๊ณ„ํš์ด๋ผ๋ฉด ๋ชจ๋“  ๋ชจ๋“ˆ ํŒŒ์ผ์„ ES6 ํŒŒ์ผ๋กœ ๋นŒ๋“œํ•˜๋Š” #15526 / #15543(์ง€๊ธˆ์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ญ์ œ๋จ)์„ ๋˜์‚ด๋ฆฌ๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์˜ˆ์ œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ํŒŒ์ผ(์˜ˆ: ์…ฐ์ด๋” ๋…ธ๋“œ)์— ํผ์ ธ ์žˆ๊ณ  ์ผ๋ถ€ ๋ชจ๋“ˆ์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ํŒŒ์ผ์˜ ๋ช…์‹œ์  ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋„๋ก ๋กค์—… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฐ ์ถœ๋ ฅ. ์ถœ๋ ฅ๋˜๋Š” ํŒŒ์ผ ์‚ฌ์ด์—๋„ ์ข…์†์„ฑ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์„ ๋•Œ ์žƒ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ์ˆ˜์—…์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํฌ๋งํ•˜์ง€๋งŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

import orbitalcontrols from  orbitalcontrolsURL

class mycontrols extends orbitalcontrols {
// do the edits I care about
}

๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์—

let controls = new myorbitalcontrols

ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์„ ๋•Œ ์žƒ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ์ˆ˜์—…์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํฌ๋งํ•˜์ง€๋งŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ถค๋„ ์ œ์–ด URL์—์„œ ๊ถค๋„ ์ œ์–ด ๊ฐ€์ ธ์˜ค๊ธฐ

ํด๋ž˜์Šค mycontrols๋Š” orbitalcontrols๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค {
// ๋‚ด๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ํŽธ์ง‘์„ ์ˆ˜ํ–‰
}

๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์—

let ์ปจํŠธ๋กค = ์ƒˆ๋กœ์šด myorbitalcontrols

๋ถ€๋ชจ "ํด๋ž˜์Šค"๊ฐ€ ๊ฐ„๋‹จํ•œ js ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋„ ์ด๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ(๋””๋ฒ„๊ฑฐ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ์—์„œ):

Promise.all([
    import('https://unpkg.com/three/build/three.module.js')
        .then( mod=> [mod.Camera, mod.WebGLRenderer] ),
    import('https://unpkg.com/three/examples/jsm/controls/OrbitControls.js')
        .then( mod=> mod.OrbitControls )
])
.then( ([
    [ Camera, WebGLRenderer ],
    OrbitControls
])=> new ( class extends OrbitControls {} )( new Camera, (new WebGLRenderer).domElement )
)
.then( console.log )

... ๋˜๋Š” ๋” ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ:

(async function() {

let { Camera, WebGLRenderer } = await import('https://unpkg.com/three/build/three.module.js')
,   { OrbitControls } = await import('https://unpkg.com/three/examples/jsm/controls/OrbitControls.js')

class Con extends OrbitControls { }

let my = new Con( new Camera, (new WebGLRenderer).domElement )
console.log( my )

})()

aynom ํ•จ์ˆ˜์™€ async/await ์•ฝ์†์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ๋ฉ‹์ง„

class mycontrols extend orbitalcontrols {
 // do the edits I care about
 }

์ด์ƒ์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณ€๊ฒฝ ์‹œ ์›๋ณธ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๋„๋ก ์ง€์‹œํ•˜๊ธฐ๋ณด๋‹ค ์Šน๊ฒฉํ•ด์•ผ ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ์ œ๋Š” ํ™•์žฅ์„ฑ์„ ์—ผ๋‘์— ๋‘๊ณ  ์ž‘์„ฑ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๊ฒฐ๊ตญ ์ „์ฒด ์›๋ณธ ์˜ˆ์ œ๋ฅผ ํ™•์žฅ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ๋ณต์‚ฌํ•˜์—ฌ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋ฏ€๋กœ extend ์‚ฌ์šฉ์— ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, OrbitControls ์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฒญ๋˜๋Š” ๋ณ€๊ฒฝ ์€ pan ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ @Mugen87 ์˜ ๋ฐ”์ด์˜ฌ๋ฆฐ ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ controls.update ๋ฉ”์„œ๋“œ์—์„œ minPan ๋ฐ maxPan ๋ฒกํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  controls.target ๋ฅผ ํด๋žจํ”„ํ•ฉ๋‹ˆ๋‹ค.

OrbitControls ํ™•์žฅํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ€๊ฒฝ์„ ์‹œ์ž‘ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ update ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

class OrbitControlsPanLimit extends OrbitControls {
    constructor(object, domElement) {
        super(object, domElement);
    }

    update() {
        super.update();
        console.log('Custom update function');
    }
}

์ด ํ™•์žฅ ํด๋ž˜์Šค๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ( glitch ), ์ด ์ƒˆ๋กœ์šด OrbitControlsPanLimit.update ๋ฉ”์„œ๋“œ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์›๋ž˜ OrbitControls.update ๋ฐฉ๋ฒ•์ด ๊ณ„์† ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž์—์„œ ์žฌ์ •์˜ํ•˜์—ฌ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class OrbitControlsPanLimit extends OrbitControls {
    constructor(object, domElement) {
        super(object, domElement);

        this.update = () => {
            console.log('Custom update function');
        }
    }
}

์—ฌ๊ธฐ์„œ super.update() ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์œ ์ผํ•œ ์˜ต์…˜์€ ์ „์ฒด ์›๋ณธ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋ฐฉ๋ฒ•์€ OrbitControls ๋‚ด์—์„œ ์ด ๋งŽ์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ• ๊ฐ„์— ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.

    //
    // internals
    //

    var scope = this;

    var changeEvent = { type: 'change' };
    var startEvent = { type: 'start' };
    var endEvent = { type: 'end' };

    var STATE = {
        NONE: - 1,
        ROTATE: 0,
        DOLLY: 1,
        PAN: 2,
        TOUCH_ROTATE: 3,
        TOUCH_PAN: 4,
        TOUCH_DOLLY_PAN: 5,
        TOUCH_DOLLY_ROTATE: 6
    };

    var state = STATE.NONE;

    var EPS = 0.000001;

    // current position in spherical coordinates
    var spherical = new THREE.Spherical();
    var sphericalDelta = new THREE.Spherical();

    var scale = 1;
    var panOffset = new THREE.Vector3();
    var zoomChanged = false;

    var rotateStart = new THREE.Vector2();
    var rotateEnd = new THREE.Vector2();
    var rotateDelta = new THREE.Vector2();

    var panStart = new THREE.Vector2();
    var panEnd = new THREE.Vector2();
    var panDelta = new THREE.Vector2();

    var dollyStart = new THREE.Vector2();
    var dollyEnd = new THREE.Vector2();
    var dollyDelta = new THREE.Vector2();

์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๊ฑฐ์˜ ์ „์ฒด ์›๋ณธ OrbitControls ์„ OrbitControlsPanLimit ์ƒ์„ฑ์ž๋กœ ๋ณต์‚ฌํ•ด์•ผ ํด๋ž˜์Šค ํ™•์žฅ์˜ ๋ชฉ์ ์„ ๋ฌดํšจํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ์„ฑ์„ ์—ผ๋‘์— ๋‘๊ณ  ์ปจํŠธ๋กค์„ ํด๋ž˜์Šค๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ์— ์ฐจ์ž„์— ๋Œ€ํ•ด @looeee ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์ž์‹ ์˜ ๋…ธ๋ ฅ์—์„œ ์‰ฌ์šด ํ•ด๊ฒฐ์ฑ…์„ ๋†“์ณค์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ด์ œ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์Šค์Šค๋กœ ์ผ์–ด์„ฐ๋˜ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณ€๊ฒฝ ์‹œ ์›๋ณธ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๋„๋ก ์ง€์‹œํ•˜๊ธฐ๋ณด๋‹ค ์Šน๊ฒฉํ•ด์•ผ ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์กฐ์‹ฌํ•˜์„ธ์š”. ์ƒ์† ๋Œ€ ๊ตฌ์„ฑ ์ธ์ˆ˜์— ๋Œ€ํ•ด ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์–ด๋–ค ํŒจํ„ด๋„ ํ™๋ณดํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์˜ ๊ธฐ๋Šฅ๊ณผ ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™๋ณดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ, ์Šคํƒ, ๋นŒ๋“œ ์‹œ์Šคํ…œ, ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ๋„์„œ๊ด€์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ง€์—ญ ์‚ฌํšŒ์˜ ๋ณต์žกํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ˆ˜์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ๋‚ด์ผ์ด๋ฉด ์˜ค๋ž˜๋œ ๊ฒƒ์ด๊ณ  ํŒจํ„ด์€ ์™”๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ƒ์ˆ˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์—ญํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค.

Windows 10์—์„œ DOS ๊ฒŒ์ž„์„ ๊ณ„์† ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์† ๋Œ€ ๊ตฌ์„ฑ ์ธ์ˆ˜

์ œ๋ฐœ ์•„๋‹ˆ. ์ด '์ธ์ˆ˜'์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ž‘์—…์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์†, ๊ตฌ์„ฑ, ๊ธฐ๋Šฅ, ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๋“ฑ์„ ์œ„ํ•œ ์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ three.js๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ(์‚ฌ์šฉ, ์žฌ์‚ฌ์šฉ, ์ˆ˜์ •)ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ js ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ ๋„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์„ ํ™๋ณดํ•˜๋Š” ๊ฒƒ์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

ํ™๋ณดํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ

์˜ˆ ๋ฐ ์•„๋‹ˆ์˜ค.

๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์˜ ๊ธฐ๋Šฅ๊ณผ ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™๋ณดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ๋‹น์‹ ์„ ์œ„ํ•ด ์„ค์ •๋œ ๋ฌธ์ œ/๊ธฐ๋Šฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋˜ํ•œ ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ, ์Šคํƒ, ๋นŒ๋“œ ์‹œ์Šคํ…œ, ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. threejs ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ €์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋“ค์€ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ์ผ๋ถ€ ๋กœ๋”๊ฐ€ ์ผ๋ถ€ ๋…ธ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ ์ผํ•œ ์ƒ์ˆ˜๋Š” ๊ทธ ๊ณผ์ •์—์„œ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค.

๋ณ€ํ™”๋Š” ๊ณ„์†๋œ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋•Œ๋กœ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋‹ด์œผ๋กœ:

๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์˜ ๊ธฐ๋Šฅ๊ณผ ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™๋ณดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

์–ด๋Š ๊ฒƒ์ด ๋จผ์ € ์™”์Šต๋‹ˆ๊นŒ? ๊ธฐ๋Šฅ, ํŒจํ„ด ๋˜๋Š” ๋ฌธ์ œ?
ํ™•์‹คํžˆ ํŒจํ„ด์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๊ณ  ๊ธฐ๋Šฅ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
...๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋งŒ๋“  ๊ธฐ๋Šฅ์ด์—ˆ์œผ๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ํŒจํ„ด์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

์–ด๋Š ๊ฒƒ์ด ๋จผ์ € ์™”์Šต๋‹ˆ๊นŒ? ๊ธฐ๋Šฅ, ํŒจํ„ด ๋˜๋Š” ๋ฌธ์ œ?

์–ด๋Š ๊ฒƒ์ด ๋จผ์ € ์™”์Šต๋‹ˆ๊นŒ? ์•”ํƒ‰์ธ๊ฐ€ ๋‹ฌ๊ฑ€์ธ๊ฐ€?
์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์ˆ˜ํƒ‰์ด ...

ํ›Œ๋ฅญํ•œ ํ† ๋ก , ๋ชจ๋“  ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ES6 ์˜ˆ์ œ ๋ชจ๋“ˆ์„ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋Š” ์ž‘์—…์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฒˆ๋“ค๋Ÿฌ(๋กค์—…, ๋ฐ”๋ฒจ, ์†Œํฌ, ์›นํŒฉ ๋“ฑ)์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” @gigablox ๊ฐ€ ์—ฌ๊ธฐ์„œ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ €์žฅ์†Œ์—๋Š” ์ด๋ฏธ babel, ๋กค์—… ๋ฐ ๋ช‡ ๊ฐ€์ง€ ๊ด€๋ จ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์˜ค๋Š˜ ๋ฐค์— ํ•ดํ‚น์„ ์‹œ์ž‘ํ–ˆ๊ณ  ๊ณต์œ ํ•  ๋งค์šฐ ๊ฑฐ์นœ ๋กค์—… ๊ตฌ์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

// jsm-transpiler.js
export default [
  {
    input: './examples/jsm/controls/OrbitControls.js',
    output: {
      banner:"//warning this file was generated automatically",
      file: './examples/js/controls/OrbitControls.js',
      name:'OC',
      footer:'THREE["OrbitControls"]=OC.OrbitControls',
      format: 'umd'
    }
  }
];

์ด ๋กค์—… ๊ตฌ์„ฑ ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ค์ œ๋กœ OrbitControls ๋ชจ๋“ˆ์„ THREE.OribitControls์— ์ ์ ˆํ•œ ์ƒ์„ฑ์ž๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋น„๋ชจ๋“ˆ .js ํŒŒ์ผ ํฌํ•จ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ‹์ง€๋„ค์š” :) ! ๊ทธ๊ฒƒ์€ ๋˜ํ•œ 40k ๋ผ์ธ์˜ THREE.js๋ฅผ ์ถœ๋ ฅ ํŒŒ์ผ์— ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ OrbitControls ์ƒ์„ฑ์ž๋ฅผ THREE๋กœ ์ „์†กํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก OC๋ผ๋Š” ์ค‘๊ฐ„ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ „์—ญ ๋ณ€์ˆ˜ ๊ณต๊ฐ„์„ ๋Š๋ฆฌ๊ฒŒ ์˜ค์—ผ์‹œํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋กค์—…์—๋Š” ์šฐ๋ฆฌ์˜ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ง ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์˜ฌ๋ฐ”๋ฅธ ์ค‘์ฒฉ ๋ชจ๋“ˆ์ด ํฌํ•จ/์ œ์™ธ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋งคํ•‘ ๋ฐ ๊ธฐํƒ€ ์ปจํŠธ๋กค์ด ์žˆ์Šต๋‹ˆ๋‹ค. header/footer/intro/output ์†์„ฑ์„ ํ†ตํ•ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ํŽ˜์ด๋กœ๋“œ ์ „ํ›„์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ธฐ๋Šฅ.

๋‚˜๋Š” ์†์ž„์ˆ˜๋ฅผ ์“ด ๋กค์—… ๊ตฌ์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๊ฒƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋‚™๊ด€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ๋ฒˆ๋“ค๋Ÿฌ ์‚ฌ์ด์˜ ์ฐจ์ด์ ์„ ์—ฐ๊ตฌ/์ดํ•ดํ•˜๋Š” ์‚ฌ๋žŒ์ด ์—ฌ๊ธฐ์— ๋ฌด๊ฒŒ๋ฅผ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“ˆ์ด ๋” ํ›Œ๋ฅญ ํ•ด์ง์— ๋”ฐ๋ผ ๋ชจ๋“ˆ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๋‹นํžˆ ๊ฐ•๋ ฅํ•œ ๊ฒƒ์ด ํ•„์š”ํ•˜๊ณ  ์ผ๋ถ€ ํŠธ๋žœ์ŠคํŒŒ์ผ ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ œ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/mrdoob/three.js/pull/20529

์ด๊ฒƒ์€ ์•ฝ 30์ดˆ ๋งŒ์— ๋ชจ๋“  JSM ๋ชจ๋“ˆ์„ JS ๊ธ€๋กœ๋ฒŒ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” poc ์‚ฌ์šฉ์ž ์ •์˜ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฝค ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ hello world์—์„œ GLTFLoader์™€ ๊ฐ™์€ ์ข€ ๋” ๋ณต์žกํ•œ ๋ชจ๋“ˆ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ดœ์ฐฎ์•˜์Šต๋‹ˆ๋‹ค.

๋…ธ๋ จํ•œ RegExp ๋งˆ๋ฒ•์‚ฌ์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Chrome์˜ ์ง€๋„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐฐ์†ก ์˜ˆ์ •:
https://groups.google.com/a/chromium.org/g/blink-dev/c/rVX_dJAJ-eI

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰