Three.js: ES6 ํด๋ž˜์Šค๋กœ ์ด๋™

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

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

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

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

๋…ธํŠธ:

  • Class.prototype.is** ์˜ ๊ฒฝ์šฐ Object.defineProperty( this, 'is**', { value: true } ); ์‚ฌ์šฉ
  • ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ํด๋ž˜์Šค ํ•„๋“œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #20395
  • new this.contructor() != new Foo() ... ๊ด€๋ จ ํ† ๋ก  .
  • ๋ณ‘ํ•ฉ ๋ฐ ์™„๋ฃŒ ํ›„ ํ‹ฑํ•ฉ๋‹ˆ๋‹ค.

ํŒŒํŠธ 1: src

  • [ ] src

์•„์ง 2๋ถ€ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ† ๋ก ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2๋ถ€: ์˜ˆ

  • [ ] ์˜ˆ

    • [ ] ์• ๋‹ˆ๋ฉ”์ด์…˜

    • [ ] ์นด๋ฉ”๋ผ

    • [ ] ์ปจํŠธ๋กค

    • [ ] ๊ณก์„ 

    • [ ] ํšจ๊ณผ

    • [ ] ์ˆ˜์ถœ์—…์ฒด

    • [ ] ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ

    • [ ] ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ

    • [ ] ๋ถˆ

    • [ ]์ค„

    • [ ] ๋กœ๋”

    • [ ] ์ˆ˜ํ•™

    • [ ] ๊ธฐํƒ€

    • [ ] ์ˆ˜์ •์ž

    • [ ] ์‚ฌ๋ฌผ

    • [ ] ํ›„์ฒ˜๋ฆฌ

    • [ ] ๋ Œ๋”๋Ÿฌ

    • [ ] ์…ฐ์ด๋”

ํŒŒํŠธ 3: ๋Š์Šจํ•œ ๋๊ณผ ์ •๋ฆฌ

  • [ ] src/core/Object3D
    ...

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

@ianpurvis ๋Œ€๋‹จํ•ด! ๋กค์—…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌ์„ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mrdoob ๋งˆ์นจ๋‚ด ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ webpack์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ๋‚ด ๊ตฌ์„ฑ์ด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค

import * as THREE from 'three'

console.log(THREE.WebGLRenderer)

0.119.1

0 119 1

0.120.1

0 120 1

๋ญ”๊ฐ€ ๋‚˜๋ฌด๊ฐ€ ํ”๋“ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค!

์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด AudioListener ํด๋ž˜์Šค๊ฐ€ ๋ฒˆ๋“ค์— ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค!

Screenshot 2020-09-01 at 16 49 22

Screenshot 2020-09-01 at 16 50 07

Webpack์€ ๋˜ํ•œ @ianpurvis๊ฐ€ ์ง€์ ํ•œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.


๊ทธ ํ›„ ํด๋ž˜์Šค ์™ธ๋ถ€์— ์ •์˜๋œ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Screenshot 2020-09-01 at 16 50 37

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ํด๋ž˜์Šค๋ฅผ ํŠธ๋ฆฌ๋ฅผ ํ”๋“ค ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Screenshot 2020-09-01 at 16 51 04


์ข€ ๋” ํŒŒํ—ค์นœ ํ›„ DodecahedronGeometry ์™€ ๊ฐ™์€ ๊ธฐํ•˜ํ•™ ํด๋ž˜์Šค๋Š” ์–ด๋””์—๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฒˆ๋“ค์— ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Screenshot 2020-09-01 at 16 51 29

Screenshot 2020-09-01 at 16 52 08

๋‚˜์ค‘์— ๋‚˜๋Š” ์ด๊ฒƒ์ด $ three.module.js Geometries ๊ฐœ์ฒด ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Screenshot 2020-09-01 at 17 18 32

ObjectLoader์—์„œ ์ด์™€ ๊ฐ™์€ ํŒจํ„ด ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ObjectLoader ๋ฅผ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๋ฉด ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๊ณ  src/geometries ๋Š” tree-shakeable์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์˜ค๋””์˜ค ํด๋”์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ dibs๋ฅผ ํ˜ธ์ถœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ”ˆ

@mrdoob๋‹˜ , examples ํด๋” ๋‚ด์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…ํ™•ํžˆ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” #19989๊ฐ€ ๋ณ€ํ™˜์„ ์œ„ํ•ด ๋ฐ”๋กœ ๊ฐ€๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ utils/modularize.js ๋Š” ๊ทธ ์ž‘์—…์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ ๋Š” examples/js ํด๋”์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ examples/js ์œ ์ง€ ๊ด€๋ฆฌ์˜ ๋๊ณผ examples/jsm ์‹œ์ž‘์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๊นŒ?

ํŽธ์ง‘: ๋Œ“๊ธ€ ์ฐธ์กฐ

์ˆ˜ํ•™ ํด๋”์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ˆ˜ํ•™ ํด๋”์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

@DefinitelyMaybe src/animation/ ์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

src/core ์˜ ์ผ๋ถ€: https://github.com/mrdoob/three.js/pull/20008

๋ฉ‹์ง„. ํด๋”๊ฐ€ ๊ฑฐ์˜ ์™„์„ฑ๋œ ๊ฒƒ ๊ฐ™์•„์š”. src/core/Object3D.js ๋ฐ src/core/BufferGeometry.js ๋‚จ์„๊นŒ์š”?

src/core/Object3D.js ๋ฐ src/core/BufferGeometry.js ๋‚จ์„๊นŒ์š”?

์˜ˆ, Object3D ๋ฐ BufferGeometry ์— ์˜์กดํ•˜๋Š” ES5 ํด๋ž˜์Šค๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์Š›, ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋†€๋ผ์šด ์ง„์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค ๐ŸŽ‰

src/lights ์— ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. ์œ„์˜ ๋ชฉ๋ก์—์„œ src/extras ๋ฐ src/renderers ๋ฅผ ์—ด๋ฉด ๊ฐ๊ฐ์— ์ž‘์—…ํ•  ํด๋”๊ฐ€ ๋‘ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‘ ์•ˆ๋…•,

์ด ํŒจํ„ด๊ณผ ๊ด€๋ จํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

foo.prototype = Object.assign( Object.create( bar.prototype ), {
    ...
    isDirectionalLight: true,
    ...
} );

์ง€๊ธˆ์ด์•ผ:

class foo extends bar {
  static isDirectionalLight = true;
  constructor(  ) {
    ...
  }
}

๋˜๋Š”

class foo extends bar {
  constructor(  ) {
    this.isDirectionalLight = true;
  }
}

ํ˜„์žฌ๋Š” 2์ฐจ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๊ณ  ๋ณด๋‹ˆ 1์ฐจ์— ๊ฐ€๊นŒ์› ๋˜ ์˜๋„๊ฐ€ ์•„๋‹๊นŒ ์‹ถ๋‹ค.

์ฒ˜์Œ์— ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

class foo extends bar {
  constructor(  ) {
    this.isDirectionalLight = true;
  }
}

โ˜๏ธ ๋งž์Šต๋‹ˆ๋‹ค. isDirectionalLight ๋Š” ์ข‹์€ ์˜ˆ์ด๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

$ git grep 'isDirectionalLight\b' src/ examples/js ':!*.ts'
examples/js/exporters/GLTFExporter.js:                  if ( light.isDirectionalLight ) {
examples/js/exporters/GLTFExporter.js:                  } else if ( object.isDirectionalLight || object.isPointLight || object.isSpotLight ) {
examples/js/renderers/SVGRenderer.js:                   } else if ( light.isDirectionalLight ) {
examples/js/renderers/SVGRenderer.js:                   if ( light.isDirectionalLight ) {
src/lights/DirectionalLight.js: isDirectionalLight: true,
src/renderers/webgl/WebGLLights.js:                     } else if ( light.isDirectionalLight ) {

์ฆ‰, ์ผ๋ถ€ ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class foo extends bar {
}
foo.prototype.baz = heavyThing;

์‚ฌ๋ก€๋ณ„๋กœ PR์˜ ๋‚ด์šฉ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

src/renderers/webgl ์— ์˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ‘ ๐Ÿ‘

ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์—๋Š” ๊ฝค ๋งŽ์€ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” src/renderers/webgl ์„ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฏธ์ณค๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๊ณ„์† ๊ฒ€ํ† ํ•˜๊ณ  PR์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— #20039๋ฅผ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘
๊ธฐ๋Œ€๋œ๋‹ค

@yomotsu ๊ฐ€ ์ˆ˜ํ•™ PR์—์„œ is* ์†์„ฑ์— ๋Œ€ํ•ด ์ฝ๊ธฐ ์ „์šฉ ๊ฒŒํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค... ์•„๋งˆ๋„ ๊ทธ๊ฒŒ ์ตœ์„ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

class foo extends bar {
  get isDirectionalLight() {
    return true;
  }
}

ํ  ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‹œ๋„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๊ฝค ๊ดœ์ฐฎ์€ ํŒจํ„ด์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

๋น ๋ฅธ jsfiddle ์‡ผ ์ผ€์ด์Šค

์ด ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค .

foo.prototype.isDirectionalLight = true;

src/objects ์„(๋ฅผ) ์กฐ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌผ๊ฑด์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆ˜ํ•™ ํด๋”๊ฐ€ ๋ง‰ ์™„์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
( ๋ณด๊ฐ„ ํด๋ž˜์Šค๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. )

๋ชจ๋‘ ์•ˆ๋…•,
src/objects ์„ ํ†ตํ•ด ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ผ, ์ž˜ํ–ˆ์–ด! ๐Ÿ’ช

ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ, foo.prototype.isDirectionalLight = true; ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ œ์ž๋ฆฌ์—์„œ ์ˆ˜์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์ด ์‹œ์ ์—์„œ ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ํ”„๋กœํ† ํƒ€์ž…์„ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ์ง€์ง€ ๋ง ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ๋ช…๋ฐฑํ•ด ๋ณด์ธ๋‹ค.

constructor( x = 0, y = 0, z = 0 ) {

  Object.defineProperty( this, 'isVector3', {
    value: true,
    enumerable: false,
    writable: false,
    configurable: false,
  } );

๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋” ์•”์‹œ์ ์ธ ์งง์€ ๋ฒ„์ „๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

constructor( x = 0, y = 0, z = 0 ) {

  Object.defineProperty( this, 'isVector3', { value: true } );

@marcofugaro ์ˆ๋ฒ„์ „์ด ์ž˜์–ด์šธ๋ฆฌ๋„ค์š”๐Ÿ‘

์ข‹์•„, PR์„ ํ–ˆ๋‹ค.

๋˜ํ•œ ์ด PR ์— ์˜ํ•ด ์ฐจ๋‹จ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

๋” ์ธ๊ธฐ ์žˆ๋Š” @rollup/plugin-babel ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์ธ๊ธฐ ์žˆ๋Š” @rollup/plugin-babel์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.

๋„ค, PR์„ ํ•ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿ™

@marcofugaro , @mrdoob ์•ผ! ์˜ˆ, ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, #20014๋ฅผ Object.defineProperty ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  AnimationClip ์˜ ํ•˜์œ„ ๋ถ„๋ฅ˜๋„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€ํ† ํ•  ์‹œ๊ฐ„์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ถ”๊ฐ€๋กœ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘€ ๐Ÿ™‡ ๐Ÿ™‡

๊ดœ์ฐฎ์•„. ์ด์ œ r120 ์ด(๊ฐ€) ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค... ๋ˆ„๊ตฐ๊ฐ€ ์ œ๋Œ€๋กœ ํŠธ๋ฆฌ ์‰์ดํฌ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์•ฝ๊ฐ„.
webpack์ด ํฌํ•จ๋œ ๋ฒˆ๋“ค ํŒŒ์ผ์— ๋” ์ด์ƒ ArrowHelper ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜ข

๋ฒˆ๋“ค ํฌ๊ธฐ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด์ „๊ณผ ์ดํ›„

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ์–ด Shakediff ๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ shakediff builds/three.module.js Color

๊ทธ๋Ÿฌ๋ฉด Color ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์€ ๋ชจ๋“ˆ์ด ์ƒ์„ฑ๋˜๊ณ  3์œผ๋กœ ๋ฌถ์ธ ๋‹ค์Œ ๋กค์—…์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ 3์˜ diff๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ diff๋กœ ์ž‘์—…ํ•˜๊ฑฐ๋‚˜ diffstat ์— ํŒŒ์ดํ”„ํ•˜์—ฌ ๋†’์€ ์ˆ˜์ค€์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ shakediff build/three.module.js Color | diffstat 
 three.module.js | 2878 --------------------------------------------------------
 1 file changed, 1 insertion(+), 2877 deletions(-)

์ง€๊ธˆ์€ ํŒจํ‚ค์ง€๊ฐ€ ์—†์ง€๋งŒ ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋‚ด ์ €์žฅ์†Œ์—์„œ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! โœŒ๏ธ

npm -g i ianpurvis/shakediff.git

@mrdoob๋‹˜ , examples ํด๋” ๋‚ด์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…ํ™•ํžˆ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
์ €๋Š” #19989๊ฐ€ ๋ณ€ํ™˜์„ ์œ„ํ•ด ๋ฐ”๋กœ ๊ฐ€๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ utils/modularize.js๋Š” ๊ทธ ์ž‘์—…์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  examples/js ํด๋”์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ examples/js๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋๋‚ด๊ณ  examples/jsm๋งŒ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

@mrdoob์— ๋Œ€ํ•œ ํ‰๊ฒฐ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ˆ์ œ๋ฅผ ES6 ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก jsm์„ ์ง„์‹ค์˜ ์†Œ์Šค๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ณ€ํ™˜์„ ์ง€์›ํ•˜๋„๋ก utils/demodularize.js๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ์š”?

examples/js examples/jsm ๋Š” 2020๋…„ 12์›”์— ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€๋Š” ํด๋”์˜ ๋‚ด์šฉ์„ ES6 ํด๋ž˜์Šค๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š๊ณ  ํด๋”๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‚ ์งœ ์ดํ›„์—๋Š” examples/jsm ํŒŒ์ผ์ด ์ •๋ณด์˜ ์ถœ์ฒ˜๊ฐ€ ๋˜๋ฉฐ ES6 ํด๋ž˜์Šค๋กœ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”๋“ค๋ฆฌ๋Š” ๋™์•ˆ ๋ชจ๋“ˆ ๋ฒ”์œ„ ๋ณ€์ˆ˜๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. build/three.module.js:43059 ๋„ค ๊ฐœ์˜ ๋ณ€์ˆ˜๋กœ ๋™์ž‘์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const _position$3 = new Vector3();
const _quaternion$4 = new Quaternion();
const _scale$2 = new Vector3();
const _orientation$1 = new Vector3();

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํŠน๋ณ„ํ•œ ์ฃผ์„์œผ๋กœ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ํ‘œ์‹œํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค-

const _position = /*@__PURE__*/ new Vector3();

๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜์—๊ฒŒ ์ข‹์€ ์†Œ๋ฆฌ ๐Ÿ‘Œ

์ข‹์•„์š”, Color ๋กœ ๋‚˜๋ฌด๊ฐ€ ํ”๋“ค๋ฆด ๋•Œ ๋˜ ๋‹ค๋ฅธ 144์ค„์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค ๐Ÿฅณ

์‹œ๊ฐ„์ด ์žˆ์„ ๋•Œ ๋ชจ๋‘ ๊ณต๊ฐœ PR์„ /*@__PURE__*/ ์ฒ˜๋ฆฌํ•˜์‹ญ์‹œ์˜ค!

@ianpurvis ๋Œ€๋‹จํ•ด! ๋กค์—…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌ์„ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mrdoob ๋งˆ์นจ๋‚ด ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ webpack์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ๋‚ด ๊ตฌ์„ฑ์ด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค

import * as THREE from 'three'

console.log(THREE.WebGLRenderer)

0.119.1

0 119 1

0.120.1

0 120 1

๋ญ”๊ฐ€ ๋‚˜๋ฌด๊ฐ€ ํ”๋“ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค!

์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด AudioListener ํด๋ž˜์Šค๊ฐ€ ๋ฒˆ๋“ค์— ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค!

Screenshot 2020-09-01 at 16 49 22

Screenshot 2020-09-01 at 16 50 07

Webpack์€ ๋˜ํ•œ @ianpurvis๊ฐ€ ์ง€์ ํ•œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.


๊ทธ ํ›„ ํด๋ž˜์Šค ์™ธ๋ถ€์— ์ •์˜๋œ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Screenshot 2020-09-01 at 16 50 37

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ํด๋ž˜์Šค๋ฅผ ํŠธ๋ฆฌ๋ฅผ ํ”๋“ค ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Screenshot 2020-09-01 at 16 51 04


์ข€ ๋” ํŒŒํ—ค์นœ ํ›„ DodecahedronGeometry ์™€ ๊ฐ™์€ ๊ธฐํ•˜ํ•™ ํด๋ž˜์Šค๋Š” ์–ด๋””์—๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฒˆ๋“ค์— ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Screenshot 2020-09-01 at 16 51 29

Screenshot 2020-09-01 at 16 52 08

๋‚˜์ค‘์— ๋‚˜๋Š” ์ด๊ฒƒ์ด $ three.module.js Geometries ๊ฐœ์ฒด ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Screenshot 2020-09-01 at 17 18 32

ObjectLoader์—์„œ ์ด์™€ ๊ฐ™์€ ํŒจํ„ด ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ObjectLoader ๋ฅผ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๋ฉด ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๊ณ  src/geometries ๋Š” tree-shakeable์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@marcofugaro ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค. ๋กค์—… ๊ตฌ์„ฑ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@marcofugaro ์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” shakediff์— ์›นํŒฉ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค... ์ด ์›นํŒฉ ๊ตฌ์„ฑ ์ด ๊ดœ์ฐฎ์•„ ๋ณด์ด๋‚˜์š”? terser๋Š” webpack์˜ tree-shaking์—์„œ ์ฃฝ์€ ์ฝ”๋“œ ์ œ๊ฑฐ๋ฅผ ๋‹ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹์ผ๋ถ€ ๋ณ€ํ˜• ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๋ฐฑ์ด ๋น„ํ™œ์„ฑํ™”๋œ ํžˆ์Šคํ† ๊ทธ๋žจ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ diff๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๋ฐค์˜ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ์—์„œ webpack์€ /*@__PURE__*/ ๋ฐ /*#__PURE__*/ ๋ชจ๋‘๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•ด ํ‘œ์ค€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์ผ ๋”...

@ianpurvis ๋‚ด ์ปดํ“จํ„ฐ์— shakediff ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...

Screen Shot 2020-09-22 at 9 59 04 AM

์–ด์จŒ๋“  ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

import { WebGLRenderer } from './src/renderers/WebGLRenderer.js';
console.log( new WebGLRenderer() );

๊ทธ๋ฆฌ๊ณ  Geometry ๊ฐ€ ๋‚˜๋ฌด๋ฅผ ํ”๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹˜์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. https://github.com/mrdoob/three.js/pull/20394 ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ์„ ์‹œ๋„ํ–ˆ๋‹ค.

import { Vector3 } from './src/math/Vector3.js';
console.log( new Vector3() );

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

@mrdoob ๋ถˆํ–‰ํžˆ๋„ ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” ์–ด๋–ค ๋„๊ตฌ๋กœ๋„ ํŠธ๋ฆฌ๋ฅผ ํ”๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์  ์žฅ, ์ถ•์†Œ์กฐ์ฐจ ํ•  ์ˆ˜ ์—†์–ด!

์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋™์ ์œผ๋กœ ๊ฐœ์ฒด ์†์„ฑ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ this['I am a string'] ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋„๊ตฌ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ์ง€ ์—ฌ๋ถ€์™€ ๋ฐฉ๋ฒ•์„ ๋ฏธ๋ฆฌ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค( this[variable] ์ˆ˜ ์žˆ์Œ).

์ด๊ฒƒ์€ ES6 ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜ ํด๋ž˜์Šค ๋ชจ๋‘์— ๋Œ€ํ•ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด three.min.js ์—์„œ ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ์ฒด ์†์„ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด๋„ this['I am a string'] ์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๋นŒ๋” "์—„๊ฒฉํ•œ" ๋ชจ๋“œ๋ฅผ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿคทโ€โ™‚๏ธ

๋‹ค์Œ์€ ๋กค์—…์— ๊ด€ํ•œ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ํ† ๋ก ์ž…๋‹ˆ๋‹ค. https://github.com/rollup/rollup/issues/349

ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” ์–ด๋–ค ๋„๊ตฌ๋กœ๋„ ํŠธ๋ฆฌ๋ฅผ ํ”๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์  ์žฅ, ์ถ•์†Œ์กฐ์ฐจ ํ•  ์ˆ˜ ์—†์–ด!

์ฃผ์ œ๋ฅผ ๋ฒ—์–ด๋‚˜์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ "๊ณต๊ฐœ"์™€ "๋น„๊ณต๊ฐœ"๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์ถ•์†Œ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ์ด๋ฅผ ์œ„ํ•ด ๋ฉ”์†Œ๋“œ์— "_" ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/developit/microbundle/wiki/mangle.json์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋ฌด๋ฅผ ํ”๋“œ๋Š” ๋ฐ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜•

์šฐ! #20395 ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์ข‹์€ ๋ฌผ๊ฑด @marcofugaro

๋ฐ”๋ฒจ๊ณผ ๊ธฐํ•˜ํ•™์— ๋Œ€ํ•œ ๋ฉ‹์ง„ ์†Œ์‹์ž…๋‹ˆ๋‹ค!

@ianpurvis ๋‚ด ์ปดํ“จํ„ฐ์— shakediff๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...

@mrdoob ํ , Parcel์ด ํ•ด๋‹น ๋ฒ„์ „์˜ fsevent์— ์ข…์†๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... ์•„๋งˆ๋„ ๋” ๋†’์€ ๊ฒƒ์œผ๋กœ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์— Webpack 5์˜ ํŠธ๋ฆฌ ๋–จ๋ฆผ ๊ฐœ์„  ์‚ฌํ•ญ ์— ๋Œ€ํ•œ ์ข‹์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค...

์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์— Webpack 5์˜ ํŠธ๋ฆฌ ๋–จ๋ฆผ ๊ฐœ์„  ์‚ฌํ•ญ ์— ๋Œ€ํ•œ ์ข‹์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค...

Progress... Rollup๋„ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค...

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

.is**Classname** ์†์„ฑ๊ณผ this.type = **Classname** ์˜ ๋ชฉํ‘œ๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋‚˜๋จธ์ง€๋Š” ์˜ค๋ž˜๋œ ์˜์‚ฌ ํด๋ž˜์Šค ํŒจํ„ด์ด ์•„๋‹Œ๊ฐ€์š”?
๊ทธ๊ฒƒ์„ ์™„์ „ํžˆ ์—†์• ๊ณ  ์ด ์‚ฌ์šฉ๋ฒ•์„ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜• ๊ฒ€์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

obj instanceof Vector3  // prefer this one for inheritance
// or
obj.constructor === Vector3  // prefer this for no inheritance

๋‚ด ๋ง์€, ES ํด๋ž˜์Šค๋กœ ์ด๋™ํ•˜๋Š” ๊ณผ์ •์˜ ์ผ๋ถ€๋กœ ๊ฐ์ฒด์— ์ด๋ฏธ ์ฒดํฌ ๊ฐ€๋Šฅํ•œ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค...

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด์ „์— obj instanceof Vector3 ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Rich Harris๋Š” ๋ชจ๋“  ๊ฒ€์‚ฌ๋ฅผ is* ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜์—ฌ ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. #9310

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด์ „์— obj instanceof Vector3 ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Rich Harris๋Š” ๋ชจ๋“  ๊ฒ€์‚ฌ๋ฅผ is* ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜์—ฌ ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. #9310

๋‹ต๋ณ€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. btw ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค๊ฐ€ ์ถœ๋ ฅ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋œ ํด๋ž˜์Šค X๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ์ฒด๊ฐ€ ํด๋ž˜์Šค B๋ผ๋Š” ๊ฒƒ์„ ์ธ์‹ํ•˜๋ ค๋ฉด ํด๋ž˜์Šค B๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ(์ ์–ด๋„ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ๋“  ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด) ๋ฒˆ๋“ค๋ง๋˜์–ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด WebGLRenderer๋Š” ๋ Œ๋”๋งํ•˜๋Š” ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ BufferGeometry์ธ์ง€ Geometry์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜์ง€๋งŒ Geometry ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ three.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ BufferGeometry๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ฒˆ๋“ค์—์„œ Geometry(๋ฐ ํ•ด๋‹น ํ•˜์œ„ ํด๋ž˜์Šค)๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ์ ์œผ๋กœ...

์ด ํŒจํ„ด์€ ๋ฒˆ๋“ค๋งํ•  ๋•Œ WebGLRenderer ๊ฐ€ ํ•ญ์ƒ Geometry ๋ฅผ ํฌํ•จํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

import { Geometry } from '../core/Geometry.js';
import { BufferGeometry } from '../core/BufferGeometry.js';

if ( geometry instanceof Geometry ) {
} else if ( geometry instanceof BufferGeometry ) {
}

์ด ํŒจํ„ด์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

if ( geometry.isGeometry === true ) {
} else if ( geometry.isBufferGeometry === true ) {
}

๋ชจ๋‘ ์•ˆ๋…•,

์—ฌ๊ธฐ ์—์„œ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ์ƒ๊ฐ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•„์ง์€ ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”. (1) examples/js ์— ์—†๊ณ  (2) examples/js ์— ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ํ™•์žฅ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒƒ์€ ES6 ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งˆ๋ฌด๋ฆฌ๋˜๋ฉด examples/js ๋ฅผ ํด๋ž˜์Šค๋กœ ์ „ํ™˜ํ•  ์‹œ์ ์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์–ต์—์„œ, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์•ฝ๊ฐ„์˜ ์ž‘์—…์„ ์™„๋ฃŒํ–ˆ์œผ๋ฉฐ ์•„์ง ๋Œ€๊ธฐ ์ค‘์ธ ์ผ๋ถ€ PR์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ข…์†์„ฑ/extended-in-examples ๋ชฉ๋ก์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@DefinitelyMaybe ํ—ค์ด! ๋‹น์‹ ์˜ ๋ชฉ๋ก์€ ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  @donmccurdy ์˜ ์ „๋žต์€ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ํ•œ ์ผ์„ ๋งˆ๋ฌด๋ฆฌ ์ง“๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. #20070์€ private/hidden vars๋ฅผ ES6์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์ „๋žต์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฒฉํ•˜๊ธฐ์— ์ข‹์€ PR์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค( renderers/webgl ๋ฅผ ES6์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค). ๋ชจ๋‘๊ฐ€ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ํ† ๋ก ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ์ข‹์€์ง€ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ ์ ˆํ•œ ์˜ต์…˜์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„,
์˜ˆ๋ฅผ ๋“ค์–ด ES ํด๋ž˜์Šค์— ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ PR์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@mrdoob jsm to js ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? (๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•œ๋‹ค๋ฉด ๋งํ•ด์ฃผ์„ธ์š”)

์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์ „์— #20527, #20529 ๋˜๋Š” ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ๋จผ์ € ๋ณ‘ํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/mrdoob/three.js/issues/19986#issuecomment -718308451์— ์–ธ๊ธ‰๋œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ .

@DefinitelyMaybe ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€ ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค ํ•„๋“œ ์‚ฌ์šฉ

1) ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?
๊ทธ๋ ‡๊ฒŒ :

class Light extends Object3D {

    type = 'Light';
    isLight = true;

    color = new Color;
    intensity = 1;

    constructor(color, intensity = 1) {

        super();

        this.color = new Color(color);
        this.intensity = intensity;

    }

    copy() {
        ...
    }
}

... ์•„๋‹ˆ๋ฉด .is* ์†์„ฑ ์ „์šฉ์ธ๊ฐ€์š”?

๊ทธ๋ ‡๋‹ค๋ฉด 2) ๋นˆ ์ƒ์„ฑ์ž๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ES2015 ์‚ฌ์–‘์— ๋”ฐ๋ฅด๋ฉด super() ํ˜ธ์ถœ๋งŒ ์žˆ๋Š” ์ƒ์„ฑ์ž๋Š” ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ์•”์‹œ์ ์ด๋ฏ€๋กœ ์ผ๋ถ€ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์‹ค์ œ๋กœ ๋” ์‰ฝ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class MapControls extends OrbitControls {

    screenSpacePanning = false; // pan orthogonal to world-space direction camera.up

    mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.ROTATE };

    touches = { ONE: TOUCH.PAN, TWO: TOUCH.DOLLY_ROTATE };

}

๊ทธ๋ฆฌ๊ณ  3) private class ํ•„๋“œ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

class OrbitControls extends EventDispatcher {
    ...

    #offset = new Vector3();

    // so camera.up is the orbit axis
    #quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) ); <= this will go in constructor because of object.up
    #quatInverse = this.#quat.clone().inverse();

    #lastPosition = new Vector3();
    #lastQuaternion = new Quaternion();

    #twoPI = 2 * Math.PI;

    update() {
        ... ( no more closure and return function here )
    }

}

์ตœ์‹  Chrome์€ ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๊ฐœ ๋ฐ ๋น„๊ณต๊ฐœ ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค...

20395

์ฒซ ๋ฒˆ์งธ ์—ด์‡ ๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์„ ์ค„์ด๋ฉด ์ฒ˜์Œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@marcofugaro ์•„์ง ํด๋ž˜์Šค ํ•„๋“œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?
๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๋ณด๊ณ  ์žˆ๋‹ค:

class EdgesGeometry extends BufferGeometry {

    constructor( geometry, thresholdAngle ) {

        super();

        this.type = 'EdgesGeometry';

๋ฐ”๋€Œ์—ˆ๋‹ค:

class EdgesGeometry extends BufferGeometry {

    type = 'EdgesGeometry';

    constructor( geometry, thresholdAngle ) {

        super();

๋‚ด๊ฐ€ " new this.contructor() != new Foo() "๋ฅผ ๋งŒ๋‚œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ฃผ์˜ ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ ํด๋ž˜์Šค ํ•„๋“œ

์ด๊ฒƒ์€ ์ง„ํ–‰ ์ค‘์ธ ํ† ๋ก ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๊นŒ์ง€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง€์ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋‚˜ PR์ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@marcofugaro ์•„์ง ํด๋ž˜์Šค ํ•„๋“œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?
๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๋ณด๊ณ  ์žˆ๋‹ค:

์˜ˆ, ์ด์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ .is* ์†์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๊ณ  ์“ธ ์ˆ˜ ์—†์–ด์•ผ ํ•˜๋ฏ€๋กœ Object.defineProperty(this, ... ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์†์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋‹ค์‹œ ํ™•์ธ๋ฉ๋‹ˆ๊นŒ? Object.defineProperty(this, ... ๋Œ€์‹  static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์–ด๋–ป๊ฒŒ ๋‹ค์‹œ ํ™•์ธ๋ฉ๋‹ˆ๊นŒ? Object.defineProperty(this, ... ๋Œ€์‹  static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

obj.is* ๋Š” ํด๋ž˜์Šค ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ธ์Šคํ„ด์Šค์— ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

babel์ด ํ˜„์žฌ ์„ค์ •์—์„œ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๋ณ€ํ™˜ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์—ด๊ฑฐ ๋ถˆ๊ฐ€๋Šฅ/์“ฐ๊ธฐ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

import { unwrittable, unenumerable } from 'some/decorator/helpers.js'

class Foo {
    @unwrittable<strong i="12">@unenumerable</strong>
    isFoo = true;
}

@DefinitelyMaybe static ์†์„ฑ์€ ๋‹ค๋ฅด๋ฉฐ ํด๋ž˜์Šค ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ธ์Šคํ„ด์Šค์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

class Test {
  static staticProp = true

  constructor() {
    Object.defineProperty(this, 'definedProp', { value: true })
  }
}
const test = new Test()

console.log(test.staticProp, test.definedProp)

๊ฒฐ๊ณผ:

undefined true


ํŽธ์ง‘ : ๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค ...
๋„ค, ๋„ค.

์ œ ์š”์ ์€ ์ด ์†์„ฑ์„ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

class Test {
  constructor() {
    Object.defineProperty(this, 'definedProp', { value: true })
  }
}

์—๊ฒŒ

class Test {
  static definedProp = true
  constructor() {
  }
}

๊ทธ๋ž˜์„œ ์ด ๊ฒ€์‚ฌ๊ฐ€ ์–ด๋””์„œ, ์™œ ์ผ์–ด๋‚˜๋Š”์ง€, ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค.

@DefinitelyMaybe ๋ฌธ์ œ๋Š” ์ธ์Šคํ„ด์Šค ์œ ํ˜•์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์Šคํ„ด์Šค์˜ ํด๋ž˜์Šค์— ์•ก์„ธ์Šคํ•˜์—ฌ ์ •์  ์†Œํ’ˆ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ ์ •์  ์†Œํ’ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์€ ์ด๋ฏธ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...

obj.constructor.isFoo == true
obj.constructor.name == 'Foo'

ํŽธ์ง‘: ์ด ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ์—ฌ๋Ÿฌ .is*๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ตœ์ข… ํด๋ž˜์Šค ์ด๋ฆ„ ํ•˜๋‚˜์™€ ๋น„๊ตํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ ์ƒ์† ์ฒด์ธ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค...

obj.constructor.isFoo || obj.constructor.isBar || obj.constructor.isBaz

Edit2: ๋„ค, ๋งˆ์ง€๋ง‰์œผ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ๋„ ๋™์ผํ•˜๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค...

let types = getInheritanceNames(obj) // looping each .constructor.prototype.constructor.name
types.contains( 'Foo' ) || types.contains( 'Bar' ) || types.contains( 'Baz' ) 

์ธ์Šคํ„ด์Šค์—์„œ

์ด๋Ÿฐ. ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ์ฝ์œผ์‹ญ์‹œ์˜ค. ๊ทธ๋ž˜, ๋‚ด๊ฐ€ ๋ฌด์Šจ ๋ง์„ ํ–ˆ๋Š”์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ.

if ( scope.object.isPerspectiveCamera ) {
...
}
if ( geometry.isBufferGeometry ) {
...
}
if ( material.isShaderMaterial ) {
...
}

์˜ค๋ฅธ์ชฝ. ๋‘๊ฐ€์ง€.

  • ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์ด ๋‚จ์•˜์Šต๋‹ˆ๊นŒ?

examples/js ๋ฅผ ์–ธ์ œ ํด๋ž˜์Šค๋กœ ์ „ํ™˜ํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ง„ํ–‰์„ ์œ„ํ•ด ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์— ๊ฐ€๊นŒ์›Œ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

#20527 ๋˜๋Š” #20529๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‘˜ ๋‹ค examples/js ๋ฅผ ํ˜„์žฌ ํ˜•์‹์œผ๋กœ ๋‹ค์‹œ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๊ณณ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ดˆ๊ธฐ ์ œ์•ˆ์€ examples/js ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์–ด๋ ค์›€์— ์ฒ˜ํ•ด ์žˆ๋Š๋ƒ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ @mrdoob ์ด ์ตœ๊ทผ์— ๋งํ•œ ๊ฒƒ์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ง€๋‚œ ๋ช‡ ์ฃผ ๋™์•ˆ ๋ชจ๋“ˆ ์ž‘์—…์„ ํ•ด์˜จ ์‚ฌ๋žŒ์œผ๋กœ์„œ ์›Œํฌํ”Œ๋กœ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ๊ฐœ๋…์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฒˆ๋“ค๋Ÿฌ์™€ ํด๋ฆฌํ•„์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ Three.js๊ฐ€ ์ฒ˜์Œ์— ์„ค๋ช… ๋˜๋Š” ๋ฐฉ์‹์„ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ REPL ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ Three.js์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜๋ฉด ์ด ์˜์—ญ์—์„œ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ ์”ฌํ•œ ์˜ˆ

๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๋น„ํด๋ž˜์Šค ํŒจํ„ด์„ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

function Foo() {

    this.update = function () {

        var priv = 'foo'

        return function update() {
            ...
        };

    }();

}

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

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

๋‚˜๋Š” ์ด ์ „๋žต์— ๋™์˜ํ•˜์ง€๋งŒ, ๋ฌผ๋ก  ๊ฒฐ์ •์€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์œ ์ง€ ๊ด€๋ฆฌ์ž์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์‹œ์›ํ•œ. ๋จผ์ € src ๋‚ด์—์„œ ์ด๊ฒƒ์„ ๊ณผ์‹œํ•˜๋Š” ๊ฒƒ์ด ์•„์ด๋””์–ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, @devingfx ๊ฐ€ src ๋‚ด์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ด์ƒํ•œ ํŒจํ„ด์„ ์ฐพ๊ณ  ๋Œ€์‹  ๊ฐœ์ธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” PR์„ ๋งŒ๋“ค๊ณ  babel์ด ํ•˜๋Š” ์ผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ.

์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฒ€์ƒ‰: internal , private , readonly ๐Ÿ‘€

์ž ๊น๋งŒ, ๋ชจ๋“  _* ๋ณ€์ˆ˜๊ฐ€ ๋น„๊ณต๊ฐœ๋กœ ์„ค์ •๋˜์—ˆ๋‚˜์š”?

...

์ด ๋ฐฉ์˜ ์ฝ”๋ผ๋ฆฌ๋Š” src/renderers/WebGLRenderer.js ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WebGLAnimation์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ, ์ข‹์€ ์†Œ๊ทœ๋ชจ ์ˆ˜์—…์ž…๋‹ˆ๋‹ค... https://github.com/mrdoob/three.js/pull/20070

์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ €๋Š” exemples/js ์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ OrbitControls์—์„œ ์ด๊ฒƒ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค...

babel์ด ๊ทธ๊ฒƒ์œผ๋กœ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ์„ธ์š”.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด mrDoob์˜ ๊ตฌ๋ฌธ ์ƒ๊ฐ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜…

์˜ค๋ฅธ์ชฝ์œผ๋กœ.

๊ทธ๋ฆฌ๊ณ  ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋‘๋‡Œ๋Š” ์–ด๋””์—... examples ํด๋” ๋ณ€ํ™˜์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋ณ‘ํ•ฉํ•  #20527 ๋˜๋Š” #20529(๋˜๋Š” ๊ธฐํƒ€) ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. examples/js ๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฏธ๋ž˜์— ๊ณ„์† ๋ถ™์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, examples/js ํด๋”์— ํด๋ž˜์Šค๋ฅผ ๋งŒ์ง€๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€ ์•„๋‹ˆ์˜ค์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ IE์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ํ•œ์ˆจ.

๋กค์—…/๋ฐ”๋ฒจ์„ ์ด์ „ ํŒจํ„ด์œผ๋กœ ๋ณ€ํ™˜

JS PR์— ๋Œ€ํ•œ JSM์„ ํ†ตํ•ด ์ƒ๊ฐํ•˜๊ณ  ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ๊ฒฐ์ •์ด ๋‚ด๋ ค์ง€๋ฉด examples/jsm ๋ฅผ ๋ชฉํ‘œ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

src ์— ๊ฐœ์ธ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ "์ด ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์ง€ ๋งˆ์„ธ์š”. ํŠน์ • ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์˜ค๋žœ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” examples/js ํด๋”๋ฅผ ๋งŒ์ง€๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€ ๊ธˆ์ง€์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  exemples/jsm ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. exemples/js ๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— "๋นŒ๋“œ" ๋ฒ„์ „์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค...

๊ทธ๊ฒƒ์€ IE์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ํ•œ์ˆจ.

๋ญ??? 2020๋…„์—๋„ Internet Explorer์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ด 7๋…„ ๋œ ๊ณต๋ฃก์— ๋Œ€ํ•œ WebGL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ง„์ง€ํ•˜๊ฒŒ !! 1.4% ...
_(์„ธ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ IE์—์„œ ์‚ฌ์šฉํ•  ๊ณ„ํš์ธ ๊ฒฝ์šฐ ์ˆ˜์ง‘ํ•  ํ†ต๊ณ„ ์ˆ˜์ง‘๊ธฐ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ)_

๐Ÿ˜ž ํญํญํญํญํญํญํญํญํญํญํญ...

three.js ๋ฐ three.min.js ๋นŒ๋“œ ํŒŒ์ผ๊ณผ $#$ examples/js #$์˜ ๋ชจ๋“  ํŒŒ์ผ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹IE 11๊ณผ ๊ฐ™์€ ์ด์ „ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘๋…„์— IE 11(#18091)์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•ด์•ผ ํ•˜๋Š” PR์ด ์žˆ์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด ๋ธŒ๋ผ์šฐ์ €์— ์˜์กดํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ์˜ ํ˜„์žฌ ์ •์ฑ…์€ ์‚ฌ์šฉ์ž๊ฐ€ ES6์—์„œ ES5๋กœ์˜ ๋ณ€ํ™˜์„ ์Šค์Šค๋กœ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ๊ฐ ํŒŒ์ผ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ #20455์—์„œ๋„ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ข‹์•„, ์†Œ์Šค๊ฐ€ ํ˜„๋Œ€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ๋  ์ˆ˜ ์žˆ๊ณ  ๊ฒฐ๊ณผ ๋นŒ๋“œ๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜๋ฉด ํ•ด๋‹น ์ •์ฑ…์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค...
ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋Ÿฐ ์ถ”์•…ํ•œ ์ฝ”๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!
๋”ฐ๋ผ์„œ src ๊ฐ€ ESnext์— ์ž‘์„ฑ๋˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†๊ณ  ๋นŒ๋“œ๊ฐ€ ๋ณด๊ธฐ ํ‰ํ•˜์ง€๋งŒ ์ด ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ  ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ˜•์‹์ด ์ž˜ ์ง€์ •๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด exemples/js ์— ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

BTW ์™œ ์ผ๋ถ€ ์˜ˆ๋Š” ์˜ˆ์ด๊ณ  ์ฃผ์š” ํ•ต์‹ฌ ์†Œ์Šค๊ฐ€ ์•„๋‹Œ์ง€ ์Šค์Šค๋กœ์—๊ฒŒ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฌป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!?
์˜ˆ: ์ปจํŠธ๋กค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์„ ํƒ์  ์• ๋“œ์˜จ์ฒ˜๋Ÿผ ๋ณต์‚ฌ๋˜๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด ํšŒ์ „ํ•˜๋Š” ํ๋ธŒ ์˜ˆ์ œ์™€ ๊ฐ™์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ฝ๊ณ  ์˜๊ฐ์„ ์–ป๋Š” ์‹ค์ œ ์˜ˆ์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

_(์ €๋Š” "webgl ํšŒ์ „ ํ๋ธŒ"๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ THREE์™€ ํ•จ๊ป˜ ์—ฌํ–‰์„ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ํ”Œ๋žซํผ์—์„œ ํ๋ธŒ๊ฐ€ ์›€์ง์ด๋Š” ์ž‘์€ ๊ฒŒ์ž„ ์„ ๊ฐœ๋ฐœํ•˜๋Š” 1๋ฐ• ์ฝ”๋“œ ๋งˆ๋ผํ†ค์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ทธ ์˜ˆ ^^)_

์ ์ ˆํ•œ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฝ”์–ด์— ์žˆ๋Š” ํŒŒ์ผ๊ณผ ์˜ˆ์ œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ํ•œ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์†Œ์Šค ํŒŒ์ผ๋งŒ ๋นŒ๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ ์ ˆํ•œ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฝ”์–ด์— ์žˆ๋Š” ํŒŒ์ผ๊ณผ ์˜ˆ์ œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ํ•œ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์†Œ์Šค ํŒŒ์ผ๋งŒ ๋นŒ๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ES ๋ชจ๋“ˆ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค ;)

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