Three.js: ์˜ˆ์ œ jsm ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ three.js ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋‘ ๋ฒˆ ๋ฒˆ๋“ค๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 09์›” 12์ผ  ยท  43์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

three/examples/jsm/.../<module> ์—์„œ ๊ฐ€์ ธ์˜ค๋ฉด ๋ฒˆ๋“ค๋Ÿฌ(๋กค์—…์œผ๋กœ ํ…Œ์ŠคํŠธ๋จ)๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ(๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ) ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋”ฐ๋ฅด๊ณ  OrbitControls.js์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ../../../build/three.module.js ์—์„œ ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ (์™ธ๋ถ€) ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ../../../build/three.module.js ๊ฐ€ three ์™€ ๋™์ผํ•œ ๋ชจ๋“ˆ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์˜ ์˜ˆ์ œ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋กœ ๋ชจ๋“ˆ ๋ฐ ์ˆ˜์ž… ์น˜๋ฃŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค three ๋Œ€์‹  ../../../build/three.module.js . ์ด๊ฒƒ์€ three.js์˜ ๋กค์—… ๊ตฌ์„ฑ์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ three ๊ฐ€ 3( src/Three.js )์˜ ์ฃผ์š” ์ง„์ž…์ ์— ๋Œ€ํ•œ ๋ณ„์นญ์ž„์„ ๋กค์—…์— ์•Œ๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ต์ˆ™ํ•ด์งˆ ์ผ๋งŒ ๋‚จ์€ ๊ฒƒ ๊ฐ™์•„์š”. ์ด์ œ ์ดํ•ด๊ฐ€ ๋˜๋‹ˆ๊นŒ ์ง€๊ธˆ ์ƒํƒœ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

BTW ์ €๋Š” threejsfundamentals๋ฅผ ๋ชจ๋‘ esm ๊ธฐ๋ฐ˜์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿคž

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

(๋กค์—…์œผ๋กœ ํ…Œ์ŠคํŠธ)

๋กค์—…์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ ์„ค์ •๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Mugen87/three-jsm

three ๋ฅผ ์™ธ๋ถ€ ์ข…์†์„ฑ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒฝ์šฐ:

export default {
    input: 'src/main.js',
    external: ['three'],
    output: [
        {
            format: 'umd',
            name: 'LIB',
            file: 'build/main.js'
        }
    ],
    plugins: [ resolve() ]
};

๊ทธ๋Ÿฌ๋ฉด ์ถœ๋ ฅ์— three.js์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ OrbitControls๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ฉด main.js ํŒŒ์ผ์˜ ์†Œ์Šค ์ฝ”๋“œ๋งŒ ์ถœ๋ ฅ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

OrbitControls import ๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์—ฌ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ 'three' ๋ฅผ ์™ธ๋ถ€ ์ข…์†์„ฑ์œผ๋กœ ์‚ฌ์šฉ).

์ด๊ฒƒ์€ #17220๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜ ์ค‘ ํ•˜๋‚˜๋Š” package.json ์˜ main ํ•„๋“œ๋ฅผ ๋ชจ๋“ˆ ๋นŒ๋“œ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ../../../build/three.module.js ๋Œ€ํ•œ ํ•˜๋“œ ์ฐธ์กฐ๋ฅผ ํฌ์ฐฉํ•˜์ง€ ์•Š๋Š” ๋กค์—… ๊ตฌ์„ฑ์˜ 3๊ฐœ์— ์˜์กดํ•˜๋Š” ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด three ๊ฐ€ ์™ธ๋ถ€๋กœ ํ‘œ์‹œ๋˜๋Š” ๋™์•ˆ ๋นŒ๋“œ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋ฉด ์‹ค์ˆ˜๋กœ OrbitControls ์ฝ”๋“œ _๋ฐ_ threejs ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๋“ค์— ํฌํ•จ๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ @adrian-delgado์˜ ๊ฒŒ์‹œ๋œ ๊ตฌ์„ฑ์œผ๋กœ ๋นŒ๋“œํ•  ๋•Œ 3๊ฐœ์˜ ๋‹ค๋ฅธ ๋ณต์‚ฌ๋ณธ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

// src/main.js
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

console.log(THREE, OrbitControls);

@์ด ๊ฐ€์น˜์—์„œ ๊ทธ ๊ฒฝ์šฐ์—๋„ ๊ฒฝ๋กœ ์ง€์  ๋  ์ˆ˜ ์•„๋“œ๋ฆฌ์•ˆ - ๋ธ๊ฐ€๋„ OrbitControls.js ๋กœ ๋ณ€๊ฒฝ three ์—ฌ์ „ํžˆ ๋˜๋Š” ์›ํ•˜๋Š”๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์ ์–ด๋„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ๋ฒˆ๋“ค์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค OrbitControls ์ข…์† ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋‘ ๋ฒˆ ํฌํ•จ๋˜๋Š” OrbitControls ์ฝ”๋“œ.

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

export default {
    // ...

    external: p => /^three/.test(p),

    // ...
};

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

์–ด๋–ค ์ด์œ ๋กœ ๋กค์—…์ด ๊ธฐ๋ณธ์ ์œผ๋กœ 'three/examples/jsm/controls/OrbitControls.js' ๋„ ์™ธ๋ถ€๋กœ ์ทจ๊ธ‰ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์€ ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ๋œ #17220์€ ๋งค์šฐ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ™”๋Š” ์•„๋งˆ๋„ ๊ทธ๊ณณ์—์„œ ๊ณ„์†๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

// src/main.js
import * as THREE from 'three/build/three.module.js';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

console.log(THREE, OrbitControls);

๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€๋งŒ 3์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ lib ๋˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์ด "3"์—์„œ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ๋‹ค์‹œ ์ค‘๋‹จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Package.json์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ™˜๊ฒฝ์— ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. "build/three.module"์€ ๋ˆ„์ถœ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๋ฐฐํฌ ์„ธ๋ถ€ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์„ ๊ฑด๋„ˆ๋›ฐ๋ฉด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฌธ์ œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  external: p => /^three/.test(p),

@gkjohnson ์‚ฌ์šฉ์ž๊ฐ€ "3" ์ธ์Šคํ„ด์Šค์™€ OrbitControls ๋ฅผ ๋ฒˆ๋“ค์— ํฌํ•จ์‹œํ‚ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋ชจ๋“ˆ์„ ์ด๋ ‡๊ฒŒ ๋ผ์ด๋ธŒ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋น„์Šทํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';

three.js๋ฅผ ๋‘ ๋ฒˆ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์€ CDN์—์„œ, ํ•œ ๋ฒˆ์€ threejs.org์—์„œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์ด 3๊ฐœ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ 106๊ฐœ ์ด์ „๋ถ€ํ„ฐ 1000๊ฐœ์˜ ์‚ฌ์ดํŠธ์™€ ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/105/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>

๋ชจ๋“  ์˜ˆ์ œ๋Š” ๋นŒ๋“œ(๋ฒˆ๋“ค๋ง) ๋Œ€์‹  ๋ผ์ด๋ธŒ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ์˜ˆ์ „์ฒ˜๋Ÿผ three.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ „ ์˜ˆ์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์˜ˆ์ œ๋Š” AFAIK๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ์˜ˆ์ œ์—์„œ JavaScript๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋ณ„๋„์˜ .js ํŒŒ์ผ์— ๋„ฃ์€ ๋‹ค์Œ three.js๋ฅผ ๋กœ์ปฌ๋กœ(์•„๋งˆ๋„ npm์„ ํ†ตํ•ด) ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๊ธฐ๋ฐ˜ ๊ฒฝ๋กœ(../.././build ์—†์Œ)๊ฐ€ ๋˜๋„๋ก ์˜ˆ์ œ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๋กค์—…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ–ˆ๋˜ ๋น„ ๋ชจ๋“ˆ ๋ฒ„์ „์—์„œ ๊ฝค ํฐ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

@mrdoob

@adrian-delgado์˜ ์›๋ž˜ ๊ตฌ์„ฑ์œผ๋กœ three.js๋Š” ํ•œ ๋ฒˆ ํฌํ•จ๋˜๊ณ  ๊ถค๋„ ์ œ์–ด๋Š” ํ•œ ๋ฒˆ ํฌํ•จ๋˜๋ฉฐ ํŒจํ‚ค์ง€๋Š” ์™ธ๋ถ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๊ตฌ์„ฑ์—๋Š” ์ƒ์„ฑ๋œ ๋ฒˆ๋“ค์˜ three/build/three.module.js ๋ฐ three/examples/jsm/controls/OrbitControls.js ์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์ข…์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@EliasHasle

์‚ฌ์šฉ์ž๊ฐ€ ๋ฒˆ๋“ค์— "3" ์ธ์Šคํ„ด์Šค์™€ OrbitControls๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋Ÿฐ ๋‹ค์Œ external ํ•„๋“œ๋Š” ์ œ์™ธ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ด ๊ฒฝ์šฐ 3๊ฐœ์˜ ๋‹จ์ผ ์‚ฌ๋ณธ๊ณผ ๊ถค๋„ ์ œ์–ด๊ฐ€ ๋ฒˆ๋“ค์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. rollup-plugin-node-resolve (๋ชจ๋“ˆ ํ™•์ธ์„ ์ง€์›ํ•˜๋Š” ๋กค์—…์— ํ•„์š”ํ•˜๋ฉฐ ์œ„์˜ ๊ตฌ์„ฑ์—์„œ ์‚ฌ์šฉ๋จ)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ package.json์˜ ๋ชจ๋“ˆ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค( mainFields ์˜ต์…˜ ์ฐธ์กฐ). ์„ธ ์ฐธ์กฐ๋ฅผ ์ œ์–ดํ•˜๊ณ  "three"๋Š” ๋™์ผํ•œ ์Šคํฌ๋ฆฝํŠธ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. _ mainFields ๊ฐ€ ["main", "module"] mainFields ๋กœ ๋ณ€๊ฒฝ๋˜์–ด package.json_์—์„œ "module" ๋Œ€์‹  "main"์ด ์‚ฌ์šฉ๋˜๋ฉด 3๊ฐœ์˜ ๋ณต์‚ฌ๋ณธ์ด ์—ฌ๊ธฐ์— ํฌํ•จ๋˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์ด์ „ ๋ฐฉ์‹์œผ๋กœ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ•œ. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ "main"์ด ์‚ฌ์šฉ๋˜๋ฉด rollup์€ ๊ธฐ๋ณธ์ ์œผ๋กœ require๋ฅผ ์‚ฌ์šฉํ•˜๋Š” commonjs ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— rollup -plugin-commonjs ๋„ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@๊ทธ๋ ˆ๊ทธ๋งŒ

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

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/examples/jsm/controls/OrbitControls.js';

// or

import * as three from 'https://threejs.org/build/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';

์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ํด๋ž˜์‹ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„๊นŒ์š”?

@๊ทธ๋ ˆ๊ทธ๋งŒ

๋ชจ๋“ˆ์„ ์ด๋ ‡๊ฒŒ ๋ผ์ด๋ธŒ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋น„์Šทํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';

์‘.. ๊ทธ๋Ÿฐ ๋ชจ๋“ˆ ์“ฐ์ง€๋งˆ ๐Ÿ˜

์‘.. ๊ทธ๋Ÿฐ ๋ชจ๋“ˆ ์“ฐ์ง€๋งˆ ๐Ÿ˜

๋™์˜. ๋ฌธ์„œ์™€ ์˜ˆ์ œ๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ jsm ์˜ˆ์ œ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋ฉฐ ๋นŒ๋” ์—†์ด๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ CDN์„ ํ†ตํ•ด ์ž‘๋™ํ•˜์ง€๋„ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ผ์ข…์˜ ํฐ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

์ด์ „์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ˆ์ œ์—์„œ ์†Œ์Šค๋ฅผ ๋ณด๊ณ  jsfiddle/codepen ๋“ฑ์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์˜ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ three.js ์‚ฌ์ดํŠธ์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฒ„์ „์ด ์ถฉ๋Œํ•  ๋•Œ๋งˆ๋‹ค ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ชจ๋“  ์˜ˆ์ œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์˜ˆ, ๋น„ ๋ชจ๋“ˆ ์˜ˆ์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ https://threejs.org/examples์—์„œ ๋งํฌ๋œ ์˜ˆ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)

@gkjohnson

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/examples/jsm/controls/OrbitControls.js';

์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. OrbitControls๊ฐ€ CDN์— ์—†๊ณ  OrbitContrls ../../../bulild/three.js ๋‚ด๋ถ€์˜ ๊ฒฝ๋กœ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

// ๋˜๋Š”

import * as three from 'https://threejs.org/build/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js'

๋˜ํ•œ three.js๊ฐ€ ์ƒˆ ๋ฒ„์ „์„ ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค ์ค‘๋‹จ๋˜๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

example/js ํด๋”๋ฅผ CDN์— ํ‘ธ์‹œํ•˜๊ณ  ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ URL์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋„๋ก 3๊ฐœ๋ฅผ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Š” three.module.js๊ฐ€ ๋‹ค์Œ ์œ„์น˜์— ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

https://cdnjs.cloudflare.com/ajax/libs/three.js/108/build/three.module.js

build ์ด ๊ฒฝ๋กœ์— ์ถ”๊ฐ€๋จ

์˜ต์…˜์„ ์–ธ๊ธ‰ํ•˜์ž๋ฉด jsdelivr ๋˜๋Š” unpkg์™€ ๊ฐ™์€ ๋‹ค๋ฅธ CDN์€ ES ๋ชจ๋“ˆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ˆ์ œ์—์„œ ์†Œ์Šค๋ฅผ ๋ณด๊ณ  jsfiddle/codepen ๋“ฑ์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์˜ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค...

์ข‹๋“  ๋‚˜์˜๋“  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ three.js ์‚ฌ์ดํŠธ์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์˜ˆ์ œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋„ threejs ์‚ฌ์ดํŠธ์˜ ๋ผ์ด๋ธŒ ์Šคํฌ๋ฆฝํŠธ์— ์ง์ ‘ ๋งํฌํ•˜๋„๋ก ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ๊ทธ๊ฑด ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์œ„์˜ ์˜๊ฒฌ์— ๋”ฐ๋ผ ๋ฒ„์ „์ด ์ง€์ •๋œ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๋ฌธ์„œ๋Š” ๋ชจ๋“ˆ์„ ํ†ตํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋‹ค๋ฃจ์–ด์•ผ ํ•  ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? CDN์„ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

CDN์„ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Google์˜ ์ฒซ ๋ฒˆ์งธ ํžˆํŠธ์ž‘์ธ Cloudflare CDN์€ ๋ชจ๋“ˆ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค(๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ)

@๊ทธ๋ ˆ๊ทธ๋งŒ

์ด์ „์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ˆ์ œ์—์„œ ์†Œ์Šค๋ฅผ ๋ณด๊ณ  jsfiddle/codepen ๋“ฑ์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์˜ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚œ ๋„ค ํŽธ์ด์•ผ. ๋ชจ๋“ˆ์˜ ์ตœ์•…์˜ ๋ถ€๋ถ„์€ ๋” ์ด์ƒ ์˜ˆ์ œ์˜ ์ฝ˜์†”์—์„œ camera ๋˜๋Š” renderer ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜Ÿ

unpkg๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ๊นŒ์š”?

unpkg๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ๊นŒ์š”?

๋ชจ๋“ˆ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“ˆ์˜ ์ตœ์•…์˜ ๋ถ€๋ถ„์€ ๋” ์ด์ƒ ์˜ˆ์ œ์˜ ์ฝ˜์†”์—์„œ ์นด๋ฉ”๋ผ ๋˜๋Š” ๋ Œ๋”๋Ÿฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค, ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ์ด๊ฒƒ์„ (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ) ์˜ˆ์ œ์— ๋˜์กŒ์Šต๋‹ˆ๋‹ค.

Object.assign( window, { camera, renderer, scene } );

๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœ ๋„๊ตฌ ํ™•์žฅ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์กฐ์‚ฌ๋ฅผ ์ทจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค,ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€ ๊ธฐ๊บผ์ด ๊ฒฝ์šฐ ... ์žฌ๋ฏธ์žˆ์„ ์ˆ˜์žˆ๋Š” ํ•˜๋‚˜ ๊ฐœ์˜ ์•„์ด๋””์–ด ์ˆ˜์ž… ๋งต polyfill์„ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์ž…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ, ๋ชจ๋“  ์˜ˆ์ œ๋Š” 100 % ๋ณต์‚ฌ / npm-์™€ ํ˜ธํ™˜์ด ๋ถ™์—ฌ ์‚ฌ์šฉ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ. ์˜ˆ๋ฅผ ๋“ค์–ด:

<script defer src="es-module-shims.js"></script>
<script type="importmap-shim" src="importmap.dev.js"></script>

<!-- ... -->

<script type="module-shim">
  import { Scene, WebGLRenderer } from 'three';
  import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';

  // ...
</script>

unpkg๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ๊นŒ์š”?

๋ชจ๋“ˆ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๊นŒ?

https://threejs.org/build/ ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์‹  ISSUE_TEMPLATE ์—์„œ ํ•ด๋‹น ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  @greggman ์•„๋งˆ ์ „ํ™˜ ํ•  ์ˆ˜ https://cdnjs.cloudflare.com/ajax/libs/three.js/108/ ์— https://unpkg.com/[email protected]/ ?

unpkg๊ฐ€ ์—ฌ๊ธฐ์„œ ๋…ผ์˜ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋„ค, ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ์ด๊ฒƒ์„ (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ) ์˜ˆ์ œ์— ๋˜์กŒ์Šต๋‹ˆ๋‹ค.

Object.assign( window, { camera, renderer, scene } );

์œผ์•…! ใ…‹

๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœ ๋„๊ตฌ ํ™•์žฅ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ! ๐Ÿคž

@๊ทธ๋ ˆ๊ทธ๋งŒ

๋ชจ๋“ˆ์„ ์ด๋ ‡๊ฒŒ ๋ผ์ด๋ธŒ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋น„์Šทํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';

์‘.. ๊ทธ๋Ÿฐ ๋ชจ๋“ˆ ์“ฐ์ง€๋งˆ ๐Ÿ˜

๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ๊ทธ๋ƒฅ ํ•˜๊ณ  ์žˆ๋Š” ๋‚˜ ์ž์‹ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค... ๐Ÿ˜… ์ •๋ง ๋‚˜์œ ๋ฒ„๋ฆ‡์ด์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ผ์ด ์ž˜ ๋˜๋Š”๋ฐ ๋ญ”๊ฐ€ ๊ณ ์žฅ๋‚˜๋ฉด ๊ณ ์น˜๊ธฐ๊ฐ€ ๊ฝค ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝ์šฐ์—๋Š” ๋‚ด๊ฐ€ ์ˆ˜์ž… ๋œ three.module.js ์—์„œ dev ๋ฐ OBJLoader ์—์„œ master . OBJLoader ์ˆ˜์ž… three.module.js ์—์„œ master ๊ทธ๋ž˜์„œ BufferGeometry ํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด usage ์†์„ฑ์„ , ๋ฐ WebGLRenderer ์•Š์•˜๋‹ค usage ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์‰ฌ๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๐Ÿ˜ถ

์ด๊ฑฐ ๊ฝค ํ„ธํ„ธํ•˜๋‹ค...

์ต์ˆ™ํ•ด์งˆ ์ผ๋งŒ ๋‚จ์€ ๊ฒƒ ๊ฐ™์•„์š”. ์ด์ œ ์ดํ•ด๊ฐ€ ๋˜๋‹ˆ๊นŒ ์ง€๊ธˆ ์ƒํƒœ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

BTW ์ €๋Š” threejsfundamentals๋ฅผ ๋ชจ๋‘ esm ๊ธฐ๋ฐ˜์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿคž

๊ทธ๋ž˜๋„ three.module.min.js ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋˜๋Š” three.min.module.js ๐Ÿ˜œ).

+1

ES6 ๋ชจ๋“ˆ๋กœ 3๊ฐœ์˜ & ๊ถค๋„ ์ปจํŠธ๋กค์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถค๋„ ์ปจํŠธ๋กค์ด ๋นŒ๋“œ ํด๋” ๋‚ด์—์„œ 3๊ฐœ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๋กœ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ three.min.module.js์˜ ๊ฒฝ์šฐ +1 ๐Ÿ˜Ž

# 18239์—์„œ ์ด๋™, ๋‚˜๋Š” ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฑฐ๊ธฐ์— ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ์žกํžŒ npm link ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๊ทธ ์‚ฌ์šฉ์˜ three.js๋ฅผ์—.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ 3๋ถ„ํ•  ๋„๊ตฌ ๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉด ํ•ด์žˆ๋‹ค. three.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑ ์ค‘์ด๋ฉฐ ์˜ˆ์ œ์—์„œ ์ผ๋ถ€ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋กค์—…๊ณผ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋ฉด ๋ฒˆ๋“ค์„ ๋ณด๋ฉด 3๊ฐœ์— ๋Œ€ํ•œ 1๊ฐœ์˜ import ๋ฌธ์ด ์žˆ๊ณ  ๊ทธ ๋‹ค์Œ Three.js ์ฝ”๋“œ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ด import ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: import * as THREE from "three/build/three.module"
์ผ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ Three๊ฐ€ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋‚ด๊ฐ€ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
3๊ฐœ์— ๋Œ€ํ•œ ์ˆ˜์ž… ๋ช…์„ธ์„œ๋ฅผ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. import * as THREE from "three ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒˆ๋“ค์— 3๊ฐœ๋ฅผ ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜ค์ง€๋งŒ ์˜ˆ์ œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์ž๋งˆ์ž three.js๊ฐ€ ๋ฒˆ๋“ค์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ 3)์˜ ์ฝ”๋“œ๋กœ ์ธํ•ด ๊ถ๊ทน์ ์œผ๋กœ ๋‚ด ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋ฉ๋‹ˆ๋‹ค.

@chabb

three.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑ ์ค‘์ด๋ฉฐ ์˜ˆ์ œ์—์„œ ์ผ๋ถ€ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋กค์—…๊ณผ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋ฉด ๋ฒˆ๋“ค์„ ๋ณด๋ฉด 3๊ฐœ์— ๋Œ€ํ•œ 1๊ฐœ์˜ import ๋ฌธ์ด ์žˆ๊ณ  ๊ทธ ๋‹ค์Œ Three.js ์ฝ”๋“œ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ฒŒ์‹œ๋œ ์†”๋ฃจ์…˜์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: https://github.com/mrdoob/three.js/issues/17482#issuecomment -530957570.

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

์™ธ๋ถ€ ํŒจํ‚ค์ง€์— ๋”ฐ๋ผ Rollup์€ ์ด ๋™์ž‘์„ ๋ฌธ์„œํ™”ํ•˜๊ณ  ์—ฌ๊ธฐ ์— ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ Webpack์€ ์—ฌ๊ธฐ์— ์œ ์‚ฌํ•œ ์˜ต์…˜์„ ์ œ๊ณต

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

examples/jsm ํŒจํ‚ค์ง€๊ฐ€ ์ด ํŒจํ„ด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด...

// <strong i="7">@file</strong> GLTFLoader.js

// Before
import { Mesh } from '../../build/three.module.js';

// After
import { Mesh } from 'three';

... ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ํ›จ์”ฌ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ณต์žกํ•œ ๋นŒ๋“œ ์„ค์ • ์—†์ด threejs ์›น ์‚ฌ์ดํŠธ ๋‚ด์—์„œ HTML ์˜ˆ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. threejs ์›น์‚ฌ์ดํŠธ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต ํด๋ฆฌํ•„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :/

์˜ˆ์ œ ํŒŒ์ผ์ด ๋Œ€์‹  "3"์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๋™์•ˆ ์—ฌ์ „ํžˆ ์˜ˆ์ œ ์ฝ”๋“œ์˜ ์ค‘๋ณต ๋ฒˆ๋“ค์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค...

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ž˜ ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค. ์ƒ๋Œ€ ๊ฒฝ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์—? ํŒจํ‚ค์ง€ ๊ธฐ์ค€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@donmccurdy

๋‚˜๋Š” examples/jsm ํŒจํ‚ค์ง€๊ฐ€ ์ด ํŒจํ„ด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๋Š” ์ง๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ž˜ ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค. ์ƒ๋Œ€ ๊ฒฝ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์—? ํŒจํ‚ค์ง€ ๊ธฐ์ค€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ค๋ช…ํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ์ด๊ฒƒ์€ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๋กค์—… ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
import { stuff } from './local/src/index.js';

// library code with exports...

์—ฌ๊ธฐ์„œ ๋ชฉํ‘œ๋Š” ์œ„์˜ three.js ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์œ ์ง€ํ•˜๊ณ  ๋ฒˆ๋“ค์ด 3๊ฐœ์™€ OrbitControls๋ฅผ ํ”ผ์–ด ์ข…์†์„ฑ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด three.js์™€ OrbitControls๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๋ฒˆ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ external: [ 'three' ] ์˜ต์…˜์ด ์ด ๋™์ž‘์„ ๋‹ฌ์„ฑํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ(์ €๋Š” ํ™•์‹คํžˆ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค) ๋ฌธ์ž์—ด์ด OrbitControls ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ OrbitControls ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฒˆ๋“ค๋˜์–ด ../../../build/three.module.js ๋„ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋ฉ๋‹ˆ๋‹ค(๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—). ์‚ฌ๋žŒ๋“ค์ด ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” three.js ํ•ต์‹ฌ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ด์œ ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ค‘๋‹จ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒˆ๋“ค์ด ํ›จ์”ฌ ๋” ํฐ ๋“ฑ์˜ ํ›จ์”ฌ ๋” ๋ˆˆ์— ๋„๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ˜„์‹ค์€ _OrbitControls ํŒŒ์ผ์ด ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์žฅ์†Œ._ ์—ฌ๊ธฐ์„œ Rollup์„ ๊ตฌ์„ฑํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์˜ต์…˜์„ external: path => /^three/.test( path ) ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Š” 3๋ช…์—๊ฒŒ๋งŒ ๊ตญํ•œ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. Rollup ์€ ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉ ํ•˜์ง€๋งŒ 'lodash/merge' ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์— ๋ฒˆ๋“ค๋กœ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ž‘์•„์„œ ์ค‘๋ณต ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋จธํ‹ฐ๋ฆฌ์–ผ UI ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ์ค‘์ฒฉ๋œ ํŒŒ์ผ ์ฐธ์กฐ๋ฅผ ๊ถŒ์žฅํ•˜๋ฉฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ external: ['@material-ui/core'] ์„ค์ •์€ ๋ฒˆ๋“ค์—์„œ '@material-ui/core/Button' ๋ฅผ ์ œ์™ธํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์— ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

(1) ์‚ฌ์šฉ์ž๋Š” threejs์™€ ์˜ˆ์ œ๊ฐ€ ํ•œ ๋ฒˆ ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‘ ๋ฒˆ ์–ป์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๋™์•ˆ.

(2) ์‚ฌ์šฉ์ž๋Š” threejs์™€ ์˜ˆ์ œ๊ฐ€ 0๋ฒˆ ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•˜๊ณ  1๋ฒˆ ์ด์ƒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์™ธ๋ถ€ ๋˜๋Š” ํ”ผ์–ด ์ข…์†์„ฑ์œผ๋กœ 3๊ฐœ๊ฐ€ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋™์•ˆ.


๋‚ด๊ฐ€ ์•„๋Š” ํ•œ (1)๊ณผ (2)๋Š” ์—ฌ์ „ํžˆ ๊ฑธ๋ ค ๋„˜์–ด์ง€๊ธฐ ์‰ฌ์šด ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ์œ„์˜ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ (1)์ด ํ•ด๊ฒฐ๋˜๋ฉด ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. (2)๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ /^three/.test( path ) ํŠธ๋ฆญ์ด ๋ชจ๋“ˆ์„ ํ†ตํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ์— ์–ธ๊ธ‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@gkjohnson ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์„ ๋ช…ํ™•ํžˆํ•˜๋Š” ๋ฐ ์ •๋ง ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋กค์—… ๊ตฌ์„ฑ์—์„œ external ์ด๋Ÿฐ ์‹์œผ๋กœ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

[
        ...Object.keys(pkg.dependencies || {}),
        ...Object.keys(pkg.peerDependencies || {}),
        ...other_stuff
      ]

์„ธ ๊ฐ€์ง€๊ฐ€ ์™ธ๋ถ€ ์ข…์†์„ฑ์œผ๋กœ ์ทจ๊ธ‰๋˜๋ฏ€๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ์˜ˆ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
import from "../../../build/three.module.js"; ). ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋๋‚ด์—ˆ๋‹ค.

external: p => {
      if ([
        ...Object.keys(pkg.dependencies || {}),
        ...Object.keys(pkg.peerDependencies || {}),
        'prop-types'
      ].indexOf(p) > -1) {
        return true;
      }
      return /^three/.test(p) ;
    }

์•ฝ๊ฐ„ ๊ด€๋ จ์ด ์—†๋Š” ์งˆ๋ฌธ์ด์ง€๋งŒ package.json ์—์„œ ์„ ์–ธํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์ด ๋ฒˆ๋“ค์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๊ฐ€์ •์ž…๋‹ˆ๊นŒ?

@donmccurdy

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ (1)๊ณผ (2)๋Š” ์—ฌ์ „ํžˆ ๊ฑธ๋ ค ๋„˜์–ด์ง€๊ธฐ ์‰ฌ์šด ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

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

  1. 'three/src/Three.js' ๋˜๋Š” 'three/build/three.min.js' ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(๋ฌธ์„œ์—์„œ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ).
  2. ํ•ด๊ฒฐํ•  ๋•Œ package.module ํ•„๋“œ๊ฐ€ ์•„๋‹Œ package.main ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ธ ๊ฐ€์ง€ ํฐ ๋ฒˆ๋“ค๋Ÿฌ์ธ Rollup , Webpack ๋ฐ Parcel์€ ๋ชจ๋‘ ๊ธฐ๋ณธ์ ์œผ๋กœ main ๋ณด๋‹ค module ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋“œ๋ฌผ์ง€๋งŒ ๊ฐ€์ •์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
  3. npm link ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ ๊ฐ€์ง€์— ์˜์กดํ•˜๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋œ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(๋กค์—…์˜ preserveSymlinks ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •๋จ).
  4. ํ”Œ๋žซํผ ์€ ๋ชจ๋“ˆ๋ณด๋‹ค ๊ธฐ๋ณธ ํ•„๋“œ๋ฅผ ์šฐ์„ ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— codeandbox.io ์—์„œ ์„ธ ๊ฐ€์ง€์™€ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์‚ฌ๋žŒ๋“ค์ด ๋‚˜๋ฌด ํ”๋“ค๊ธฐ๋ฅผ ์œ„ํ•ด 1์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ˆซ์ž 4๋Š” ์‰ฝ๊ฒŒ ๊ฑธ๋ ค ๋„˜์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ž์‹ ์ด ํ†ต์ œํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋งค์šฐ ๋“œ๋ฌผ๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค.

@chabb

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ, ์˜ˆ์ œ๊ฐ€ import from "../../../build/three.module.js"; ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค: https://github.com/mrdoob/three.js/issues/17482#issuecomment -583694493. /^three ๋Š” 'three/examples/jsm/controls/OrbitControls.js' ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. 'three' ๋ฌธ์ž์—ด์€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ฐ˜๋ฉด three.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ข…์†์„ฑ์—์„œ๋„ ๋™์ผํ•œ ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์•Œ ์ˆ˜ ์—†๋Š” ํ•จ์ •์„ ํ”ผํ•˜๊ฑฐ๋‚˜ ๋ฒ ์–ด ๋ชจ๋“ˆ ์ง€์ •์ž๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€์™€ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ข…์†์„ฑ์— ๋Œ€ํ•ด ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@gkjohnson ์ž์„ธํ•œ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฒฐ๊ตญ ์ด ์Šค๋ ˆ๋“œ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฏธ ๋ช‡ ๋ฒˆ ์–ธ๊ธ‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์นจ๋‚ด ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต ํด๋ฆฌํ•„์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/KhronosGroup/ KTX-Software/pull/172/files. ํ•ด๋‹น ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ import * as THREE from 'three'; ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋งŒ ์•ฝ๊ฐ„์˜ ์ž์‹ ๊ฐ์„ ๋ณด์˜€๋‹ค๋ฉด...
https://github.com/WICG/import-maps/issues/212#issuecomment -663564421

๋‚ด ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์— ํ†ต๊ณผ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

import { /* stuff */ } from 'three'
import { Pass } from 'three/examples/jsm/postprocessing/Pass.js'

๊ทธ๋ฆฌ๊ณ  ๋‚ด ๋ชจ๋“ˆ์—์„œ ํŒจ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ๋ธŒ๋ผ์šฐ์ €์˜ three.js์—์„œ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

const threeModulePath = path.resolve( __dirname, 'node_modules/three/build/three.module.js' );

export default {
    /* ..... */
    external: [ 'three' ],
    output: [
        {
            /* .... */
            globals : {
                'three': 'THREE',
                [ threeModulePath ]: 'THREE',
            }
        }
    ]
};

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๊ณ  ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋„ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ :

๋กœ์ปฌ 3๊ฐœ ํ”„๋กœ์ ํŠธ(์•„๋ž˜ ์˜ˆ ์ฐธ์กฐ)์—์„œ ๋กœ๋“œํ•˜๋ฉด ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ค‘๋‹จ๋˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

"dependencies" : {
    "three": "file:../three.js"
}

๊ธ€์Ž„, ๋‚˜๋Š” ๊ณ„์†ํ•ด์„œ ๋กœ์ปฌ ๋งํฌ๋ฅผ ์ง€์›ํ•˜๋Š” ์ƒˆ ๋ฒ„์ „์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

const threeName = "three"; // Change with your three package name
const dependencies = require('./package.json').dependencies;
const splits = dependencies[threeName].split('file:');

const modulePath = (splits.length > 1) ?
    path.resolve(__dirname, splits[1], 'build/three.module.js'):                  // Resolve local path
    path.resolve(__dirname, 'node_modules', threeName, 'build/three.module.js');  // Resolve node_module path

const external = [
    threeName,
    modulePath,
]

const globals = {
    [threeName]: 'THREE',
    [modulePath]: 'THREE',
}

@Mcgode ์œ„์˜ https://github.com/mrdoob/three.js/issues/17482#issuecomment -530957570์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋กค์—…์„ ์‚ฌ์šฉ ์ค‘์ด๊ณ  ์˜ˆ์ œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ three.js๋ฅผ ์™ธ๋ถ€๋กœ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์ œ์•ˆ๋œ ๋Œ€๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

externals: p => /^three/.test(p),

๊ตฌ์„ฑ์„ ๊ทธ๋ ‡๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Pass.js ํŒŒ์ผ๊ณผ three.js ๋ชจ๋“ˆ์ด ๋ชจ๋‘ externel๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@gkjohnson ์˜ˆ์ œ ๊ฐ€ ์•„๋‹Œ three lib๋งŒ ์™ธ๋ถ€๋กœ ํ‘œ์‹œ๋˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋‚ด ๋นŒ๋“œ์™€ ํ•จ๊ป˜ ์˜ˆ์ œ๊ฐ€ ๋ฒˆ๋“ค๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค).

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

import {  } from "three";
import { Line2 } from "three/examples/jsm/lines/Line2";
import { LineGeometry } from "three/examples/jsm/lines/LineGeometry";

@Mcgode @recardinal ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜‘๊ฐ™์ด ํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ œ์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์ˆ˜์ž…๊ณผ ์ˆ˜์ถœ์„ '์กฐ์ •'ํ•ด์•ผ ํ–ˆ๊ณ  ๊ทธ๊ฒŒ ์ „๋ถ€์˜€์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Webpack๊ณผ THREE๋ฅผ ์™ธ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์œ ์‚ฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ์ธํ•ด three.module.js๊ฐ€ ๋ฒˆ๋“ค ์ถœ๋ ฅ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

import * as THREE from 'three';
import { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader';
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';

๋‚˜๋Š” examples/js/*๊ฐ€ ์–ด๋Š ์‹œ์ ์—์„œ ์ œ๊ฑฐ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ „์— jsm ์˜ˆ์ œ๊ฐ€ "๊ทธ๋ƒฅ ์ž‘๋™"ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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