Three.js: ๋ชจ๋“ˆ์‹ ์•„ํ‚คํ…์ฒ˜๋กœ ์ด๋™

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

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

์ฐธ๊ณ : ์ด๊ฒƒ์€ three.js ์†Œ๋น„์ž๊ฐ€ browserify๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Suggestion

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

๋งž์•„์š”, ๊ทธ๋ž˜์„œ ์•ฝ๊ฐ„์˜ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค...

๋‹น์‹ ์„ ์–ป์—ˆ๋‹ค! ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ ํ™œ๋ฐœํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Š” three-jsnext ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด Three.js ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ž๋™์œผ๋กœ ES ๋ชจ๋“ˆ๋กœ ๋งŒ๋“œ๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊นŒ๋‹ค๋กœ์šด ์ˆœํ™˜ ์ข…์†์„ฑ(ํŠนํžˆ KeyframeTrack ์ฃผ๋ณ€)๊ณผ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ณง ๊ณต์œ ํ•  ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, ๋ชจ๋“  ์˜ˆ์ œ๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•˜๊ณ  ์ถ•์†Œ๋œ ๋นŒ๋“œ๊ฐ€ ํ˜„์žฌ ๋นŒ๋“œ๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ(UMD ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Rollup์„ ์‚ฌ์šฉ) ๋ชจ๋‘ ์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค.

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

ํ•œ ๊ฐ€์ง€ ์žฅ์ ์€ ์ด๊ฒƒ์ด three.js์˜ ์ง€์†์ ์ธ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ชจ๋“ˆ์‹ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

node/browserify์˜ ๊ณตํ†ต ์Šคํƒ€์ผ์€ ๊ฐ ํŒŒ์ผ์ด ์ƒ๋‹จ์— ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๊ณ  ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜ํŒจํ„ด์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์˜ˆ์‹œ ์Šค๋‹ˆํŽซ์ž…๋‹ˆ๋‹ค.

// src/geometry/BoxGeometry.js
var Geometry = require('./Geometry.js');
var Vector3 = require('../core/Vector3.js');
module.exports = BoxGeometry;

function BoxGeometry() {
  // ...
}

BoxGeometry.prototype = Geometry.prototype;

๋˜ ๋‹ค๋ฅธ ์ด์ ์€ browserify๋ฅผ ์‚ฌ์šฉํ•˜๋Š” three.js ์†Œ๋น„์ž๊ฐ€ ์›ํ•˜๋Š” ๋ถ€๋ถ„์„ ์„ ํƒํ•˜๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Scene , BoxGeometry , PerspectiveCamera ๋ฐ WebGLRenderer , ๋ชจ๋“  ์ข…์†์„ฑ์„ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( Object3D ๋“ฑ). ์›ํ•˜๋Š” ๊ธฐ๋Šฅ ์„ธํŠธ๋งŒ ์ง€์›ํ•˜๋Š” ์ž‘์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

// src/three.js
var THREE = { rev: 101 }
module.exports = THREE

THREE.Geometry = require('./geometry/Geometry.js')
THREE.BoxGeometry = require('./geometry/BoxGeometry.js')
// ...

์ฐธ๊ณ : ์ด ํŒŒ์ผ์€ ๊ฑฐ์˜ ๋…์ ์ ์œผ๋กœ require ๋ฌธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ์˜ˆ์ œ์˜ ๋งจ ์œ„์— ์žˆ๋Š” ์ข…์†์„ฑ์„ ์ •ํ™•ํžˆ ์š”๊ตฌํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ(node/browserify, AMD)์ด ์‚ฌ์šฉ ์ค‘์ธ์ง€ ๊ฐ์ง€ํ•˜๋Š” ๋ฒ”์šฉ ๋ชจ๋“ˆ ์ •์˜๋กœ ์ด๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ , ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ ๋‚ด๋ณด๋‚ด๊ฑฐ๋‚˜ ์ „์—ญ ๊ฐœ์ฒด( window )์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ณต์Šต ํ•ด๋ณด์ž:

  • ์ข‹์€ ๋ชจ๋“ˆ์‹ ์Šคํƒ€์ผ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €ํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” three.js ์†Œ๋น„์ž๊ฐ€ ๊ธฐ๋Šฅ์„ ์„ ํƒํ•˜๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—†์Œ

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ๊ต์ฒดํ•ด์•ผ ํ•˜์ง€๋งŒ ์ƒˆ ์‹œ์Šคํ…œ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์žฅ์ :

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

@shi-314 ์ œ๊ฐ€ ์ข€ ํ˜ผ๋ž€์Šค๋Ÿฝ๋„ค์š”. You can structure your code ์™€ You can build for production ๊ฐ€ ์•„ํ‚คํ…์ฒ˜ ๋ณ€๊ฒฝ ์—†์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ธ๊ฐ€์š”? three.js ์†Œ์Šค ๋˜๋Š” three.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

three.js๊ฐ€ commonjs ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ instanceof . https://github.com/mrdoob/three.js/blob/master/src/core/Geometry .js#L82

์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์†Œ์Šค ํŠธ๋ฆฌ์— ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— instanceof ๊ฒ€์‚ฌ๊ฐ€ ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ฐ„์— ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ instanceof ๊ฒ€์‚ฌ๋ฅผ Geometry.isGeometry(geom) ์Šคํƒ€์ผ ์ธํ„ฐํŽ˜์ด์Šค ๋’ค์˜ ๊ธฐ๋Šฅ ๊ฒ€์‚ฌ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด commonjs ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@kumavis ์ €๋Š” three.js๋กœ ๋นŒ๋“œ๋œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์…ฐ์ด๋” ๋“ฑ์œผ๋กœ ์ž์‹ ๋งŒ์˜ ๋จธํ‹ฐ๋ฆฌ์–ผ์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‚˜๋จธ์ง€ three.js ์ฝ”๋“œ์™€ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ „์—ญ THREE ๊ฐ์ฒด๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

THREE.MeshMyCoolMaterial = function (...) { ... }

ํ•˜์ง€๋งŒ Browserify๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var MeshLambertMaterial = require('./../MeshLambertMaterial');
var MeshMyCoolMaterial = function (...) {...}

๋”ฐ๋ผ์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€๋˜๊ณ  ์ฝ”๋“œ์—์„œ THREE.MeshLambertMaterial ๋ฐ MeshMyCoolMaterial ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  You can build for production ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ allows three.js consumers using browserify to pick and choose functionality ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

@shi-314 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์†Œ๋น„์ž ์ •์˜ ํด๋ž˜์Šค๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆํ•œ ์ผ๋ฐ˜ ์†”๋ฃจ์…˜์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

// given that `data` is a hash of a serialized object
var ObjectClass = THREE[ data.type ]
new ObjectClass.fromJSON( data )

์ด๊ฒƒ์€ ๋‚ด ์ œ์•ˆ๋œ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๋ฆฌํŒฉํ„ฐ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://github.com/mrdoob/three.js/pull/4621

์„ฑ๋Šฅ์€ ์ด์™€ ๊ฐ™์€ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๊ธฐํƒ€ ์ฃผ์š” ์ด์ :

  • Browserify์˜ standalone ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ UMD ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UMD ๋ž˜ํผ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €ํ™”/NPM ์‚ฌ์šฉ์ž๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • threejs(์˜ˆ: poly2tri, color-string ๋“ฑ)์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ๋ฒกํ„ฐ/์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ๋ Œ๋”๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— "์‹ค์ œ๋กœ ์†ํ•˜์ง€ ์•Š๋Š”" ๋ชจ๋“ˆ์€ ๋ณ„๋„์˜ NPM ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์™€์„œ ๋‹ค๋ฅธ ๋งŽ์€ ์œ ํ˜•์˜ ํ”„๋กœ์ ํŠธ์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ์ฃผ์š” ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐœ๋ณ„ ๋ชจ๋“ˆ์— ๋ฒ„๊ทธ/๋ฌธ์ œ, PR ๋“ฑ์„ ์œ„ํ•œ ์ž์ฒด ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ThreeJS ๋ฌธ์ œ ์ •๋ฆฌ).
  • NPM์€ ์˜๋ฏธ๋ก ์  ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ ๊นจ์ง์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  threejs-vecmath ์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋Œ€๋กœ ํŠน์ • ๋ชจ๋“ˆ์—์„œ ํŒจ์น˜๋‚˜ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • EffectComposer ๋ฐ ๋‹ค์–‘ํ•œ ์…ฐ์ด๋”์™€ ๊ฐ™์€ "์ถ”๊ฐ€ ๊ธฐ๋Šฅ"์„ ์‰ฝ๊ฒŒ ํŒจํ‚ค์ง€ํ•˜๊ณ  ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( npm install threejs-shader-bloom ์ƒ์ƒ).
  • ๋ชจ๋“ˆ์ด ์ œ๊ฑฐ๋จ์— ๋”ฐ๋ผ ์ตœ์ข… ๋ฐฐํฌ ํฌ๊ธฐ๋Š” ์ ์  ์ž‘์•„์ง€๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์•ฑ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ์„ require() ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๋‹ค๋ฅธ "๋นŒ๋“œ ์œ ํ˜•"์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mrdoob ๋ฐ ๋‹ค๋ฅธ ์ €์ž์—๊ฒŒ; NPM/Browserify์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š๋‹ค๋ฉด NPM/Browserify๋กœ ๋ช‡ ๊ฐ€์ง€ ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  "์ฒ ํ•™"์— ๋Œ€ํ•œ ๋Š๋‚Œ์„ ์–ป๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ThreeJS ์•„ํ‚คํ…์ฒ˜์™€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค๋Š” ์ž‘์€ ๊ฒƒ๋“ค์„ ๋งŽ์ด ์žฅ๋ คํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋˜ ๋‹ค๋ฅธ ์ด์ ์€ ์˜คํ”ˆ ์†Œ์Šค, ํƒ€์‚ฌ Three.JS ๋ชจ๋“ˆ, ํŠนํžˆ ์…ฐ์ด๋”, ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ, ๋ชจ๋ธ ๋กœ๋” ๋“ฑ์˜ ์ƒํƒœ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. NPM ๋˜๋Š” Github/Component๋ฅผ ํ†ตํ•ด ๊ฒŒ์‹œ๋˜์–ด ์‚ฌ๋žŒ๋“ค์ด ์‰ฝ๊ฒŒ ์ฐธ์กฐํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์‚ฌ๋žŒ๋“ค์ด '์†Œ์Šค ๋ณด๊ธฐ'๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ๋ชจ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜์—ฌ ๋ฌผ๊ฑด์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Three.JS๋Š” ๋” ๋‚˜์€ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

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

+1

CommonJS/browserify ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฝ์šฐ +1, ์ฝ”์–ด๋ฅผ ๋” ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ค๊ณ  ํƒ€์‚ฌ์—์„œ ์ œ๊ณตํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ๋„ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

three.js๋ฅผ ์ž‘์€ ๋ชจ๋“ˆ๋กœ ์กฐ๊ฐํ™”ํ•˜๋Š” ๋ฐ์—๋„ ๋งŽ์€ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹œ์Šคํ…œ์€ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํƒ€์‚ฌ ์• ๋“œ์˜จ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: jetienne์˜ THREEx ๋ชจ๋“ˆ). JS ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ๋‘˜๋Ÿฌ์‹ผ ๋ž˜ํผ์ธ ํ•œ ํ˜„์žฌ ์„ค์ •์˜ ๋‹จ์ˆœ์„ฑ์— ๋Œ€ํ•ด ํ•  ๋ง์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ClojureScript๊ฐ€ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ Google์˜ Closure ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ๋ถ„์„ ๋ฐ ๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•˜์ง€ ์•Š๊ณ  ์ข…์ข… ๊ฐ„๊ณผ๋˜๋Š” ๋‹จ์ˆœํ•จ์˜ ์šฐ์•„ํ•จ +1

+1

three.js๋ฅผ ์ž‘์€ ๋ชจ๋“ˆ๋กœ ์กฐ๊ฐํ™”ํ•˜๋Š” ๋ฐ์—๋„ ๋งŽ์€ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹œ์Šคํ…œ์€ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํƒ€์‚ฌ ์• ๋“œ์˜จ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: jetienne์˜ THREEx ๋ชจ๋“ˆ).

์—ฌ๊ธฐ์„œ ์•„์ด๋””์–ด๋Š” ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด UMD ๋นŒ๋“œ๊ฐ€ ๊ณ„์† ์ œ๊ณต๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. THREEx์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฐ„๋‹จํ•œ <script> ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ThreeJS์— ์˜์กดํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊นŒ๋‹ค๋กœ์šด ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. CommonJS ํ™˜๊ฒฝ์— ์žˆ๋Š” ๊ฒฝ์šฐ ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ require() ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•„๋งˆ๋„ browserify-shim์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JS ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ๋‘˜๋Ÿฌ์‹ผ ๋ž˜ํผ์ธ ํ•œ ํ˜„์žฌ ์„ค์ •์˜ ๋‹จ์ˆœ์„ฑ์— ๋Œ€ํ•ด ํ•  ๋ง์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

ThreeJS์˜ ํ˜„์žฌ ํ”Œ๋Ÿฌ๊ทธ์ธ/ํ™•์žฅ ์‹œ์Šคํ…œ์€ ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ๋”์ฐํ•˜๋ฉฐ "๋‹จ์ˆœ"ํ•˜๊ฑฐ๋‚˜ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ThreeJS ํ”„๋กœ์ ํŠธ๋Š” EffectComposer, FirstPersonControls, ๋ชจ๋ธ ๋กœ๋” ๋˜๋Š” examples ํด๋”์— ๋– ๋‹ค๋‹ˆ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ JS ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜์กดํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ThreeJS์˜ ํ˜„์žฌ ๋นŒ๋“œ ๋‹ค์šด๋กœ๋“œ
  • ํ•„์š”ํ•œ ํŒŒ์ผ์„ vendor ํด๋”์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๋งˆ์‹œ๋ฉฐ ํ•„์š”ํ•œ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๊ฒฐํ•˜๊ณ  ์ถ•์†Œํ•˜์„ธ์š”. ๊ทธ๊ฒƒ๋“ค์„ _์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ_ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ์ด ๊นจ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์ด ๋ชฉ๋ก์„ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜์‹ญ์‹œ์˜ค.
  • ThreeJS๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค 1๋‹จ๊ณ„์™€ 2๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ ์ฝ”๋“œ๊ฐ€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์„ ๋•Œ ๋จธ๋ฆฌ๋ฅผ ๋นผ์‹ญ์‹œ์˜ค.

์ด์ œ ๋ธŒ๋ผ์šฐ์ €ํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

var FirstPersonControls = require('threejs-controls').FirstPersonControls;

//more granular, only requiring necessary files
var FirstPersonControls = require('threejs-controls/lib/FirstPersonControls');

์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ require('threejs') ๋ฐ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ๋ชจ๋“  ๊ฒƒ(์˜ˆ: GLSL ์Šค๋‹ˆํŽซ ๋˜๋Š” ํ…์ŠคํŠธ ์‚ผ๊ฐ ์ธก๋Ÿ‰ )์ž…๋‹ˆ๋‹ค. ์ข…์†์„ฑ/๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ๋ชจ๋‘ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆจ๊ฒจ์ ธ ์žˆ์œผ๋ฉฐ ์ˆ˜๋™์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” grunt/gulp ์—ฐ๊ฒฐ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊นŒ๋‹ค๋กœ์šด ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. CommonJS ํ™˜๊ฒฝ์— ์žˆ๋Š” ๊ฒฝ์šฐ ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์–ด๋–ป๊ฒŒ ์š”๊ตฌํ•ฉ๋‹ˆ๊นŒ()?

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

์ค‘์š”ํ•œ ์ ์€ ์ „์ฒด 'ํ‘œ์ค€' THREE ๊ฐœ์ฒด๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ™•์žฅํ•˜๋ ค๋Š” ๋ชจ๋“  ๊ฐœ์ฒด์—์„œ ์ด ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var THREE = require('three');

THREE.EffectComposer = // ... etc, remembering to include copyright notices :)

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

'threejs-full' ๋˜๋Š” 'threejs-classic' npm ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ํ•œ ์ด๊ฒƒ์€ CommonJS ํ™˜๊ฒฝ์—์„œ ์˜ค๋ž˜๋œ Three.js ํ•ญ๋ชฉ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฝค ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ๋˜์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฝค ํ‹ˆ์ƒˆ ์‹œ์žฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

+1
๋‹จํŽธํ™” ๋œ threejs ๋ชจ๋“ˆ์„ npm, ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๋Š” CommonJS ํ™˜๊ฒฝ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
2014๋…„ 6์›” 5์ผ ์˜คํ›„ 9์‹œ 19๋ถ„์— "Charlotte Gore" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊นŒ๋‹ค๋กœ์šด ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
CommonJS ํ™˜๊ฒฝ์— ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ค‘์š”ํ•œ ์ ์€ ์ „์ฒด 'ํ‘œ์ค€'์„ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ™•์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” 3๊ฐœ์˜ ๊ฐ์ฒด
๊ทธ๊ฒƒ.

var THREE = ์š”๊ตฌ('3');
THREE.EffectComposer = // ... ๋“ฑ, ์ €์ž‘๊ถŒ ํ‘œ์‹œ ํฌํ•จ ๊ธฐ์–ต :)

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

'threejs-full' ๋˜๋Š” 'threejs-classic' npm ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ํ•œ
์ด๊ฒƒ์€ ์˜ค๋ž˜๋œ Three.js๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฝค ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์ด ๋ฉ๋‹ˆ๋‹ค.
CommonJS ํ™˜๊ฒฝ์ด์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฝค ํ‹ˆ์ƒˆ ์‹œ์žฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/mrdoob/three.js/issues/4776#issuecomment -45236911.

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

๋ช‡ ๋‹ฌ ์ „์— ๋‚˜๋Š” frame.js ๋ฅผ require.js๋กœ

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ "์ปดํŒŒ์ผ"ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋ชฉ๋ก์—์„œ three.min.js ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ/์›Œํฌํ”Œ๋กœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

gulp -browserify ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋Š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์œผ๋กœ gulp.js ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ฝ”๋“œ๋Š” ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” grunt๋ณด๋‹ค ๋” ๊น”๋”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค: http://travismaynard.com/writing/no-need-to-grunt-take-a-gulp-of-fresh-air :wink:

๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ: (๋…ธ๋“œ, npm, ๋ฌผ๋ก  ๋ธŒ๋ผ์šฐ์ €ํ™”์— ๋Œ€ํ•œ ๋‚˜์˜ ์ œํ•œ๋œ ๊ฒฝํ—˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ)

  1. ๋‚˜๋Š” node.js ๋ชจ๋“ˆ์ด ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, npm, ๋ชจ๋“ˆ ๋ฐ require()s)
  2. ๋‚˜๋Š” ๋ธŒ๋ผ์šฐ์ €ํ™”๋„ ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค

์ฆ‰, ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ํ† ๋ก ์— ๋”ฐ๋ผ ๋ชจ๋“  ์‚ฌ๋žŒ์ด browserify์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ดํ•ด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(browserify, commonjs, requirejs, amd, umd๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์–ด๋Š ์ •๋„ ๊ด€๋ จ๋˜์–ด ์žˆ์Œ).

์ด์ œ ๋‚ด ์ƒ๊ฐ์˜ ์‚ฌ์Šฌ์„ ์กฐ๊ธˆ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด.

  1. JS๋Š” ํ›Œ๋ฅญํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  2. ์™€์šฐ, ์ด์ œ JS๋Š” ์„œ๋ฒ„ ์ธก์—์„œ๋„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. ๊ทธ๊ฒŒ node.js์ž…๋‹ˆ๋‹ค. ๋ฉ‹์ง‘๋‹ˆ๋‹ค. node.js์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  4. ํ•˜์ง€๋งŒ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค/ ๋ชจ๋“  ๊ฒƒ์„ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค/ ์‚ฌ์šฉํ•  ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  5. ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด์ œ npm ์„ค์น˜ ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•˜์„ธ์š”.
  6. ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๋ฉ‹์ง„ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  7. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
  8. ์ด์ œ ์ž ๊น๋งŒ, ์šฐ๋ฆฌ๋Š” node.js์—์„œ ์‹คํ–‰๋˜๋Š” JS๋กœ ๋งŽ์€ ๊ฒƒ๋“ค์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  9. js๋Š” ๋ธŒ๋ผ์šฐ์ €์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

Browserify๊ฐ€ ๊ทธ๋ฆผ์— ๋“ฑ์žฅํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ requireJS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ (๋น ๋ฅธ ํŒŒ์ผ ์‹œ์Šคํ…œ require()์™€ ๋‹ฌ๋ฆฌ) ๋„ˆ๋ฌด ๋งŽ์€ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  js ํŒŒ์ผ์„ ํ•จ๊ป˜ ๋ฌถ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Browserify๋Š” ์–ด๋–ค ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋” ์ตœ์ ํ™”๋œ ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ •์  ๋ถ„์„๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋ฉ‹์ง„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. (๋ฌผ๋ก , ์•„๋งˆ๋„ require('bla' + variable)๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†๋Š” ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค) node.js ์ข…์† ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์—๋ฎฌ๋ ˆ์ด์…˜ ๋ ˆ์ด์–ด๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๊ต์ฒดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ด์ œ ๋‚ด ๋ธŒ๋ผ์šฐ์ €์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” js ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ browserify๊ฐ€ https://github.com/substack/node-browserify#usage ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํ›Œ๋ฅญํ•ด ๋ณด์ด์ง€๋งŒ "๊ฑด์ถ• ํƒ์ƒ‰"์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

@mrdoob browserify์™€ ๊ด€๋ จ๋œ ์ผ๋ถ€ ๋„๊ตฌ๋Š” https://github.com/substack/node-browserify/wiki/browserify-tools์— ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

three.min.js ์™€ ๊ด€๋ จํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ถ•์†Œ๋œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. var three = require('three') ์—์„œ project.js ํ•˜๊ณ  browserify project.js > bundle.js && uglifyjs bundle.js > bundle.min.js ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ <script src="min.js"> ๋Œ€ํ•ด ์ถ•์†Œ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐฐ์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ three.js๋ฅผ ๋‹ค์Œ์œผ๋กœ ํฌ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

if ('undefined' === typeof(window))
  var window = global && global.window ? global.window : this
var self = window

๊ทธ๋ฆฌ๊ณ 

module.exports = THREE

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

module.exports = function(THREE) { /* extension-code here */ }

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

var three = require('./wrapped-three.js')
require('./three-extension')(three)

๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ์ตœ์ ์ด ์•„๋‹ˆ์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ์‹ค์ œ๋กœ ํ•จ๊ป˜ ์‚ด ์ˆ˜ ์žˆ๊ณ  ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @kumavis ์ œ์•ˆ์ด _๊ฑฐ๋Œ€ํ•œ_ ์ด์ ์ด ๋ ์ง€๋ผ๋„.

ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด 3๊ฐœ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋ณ„๋„์˜ ๋ชจ๋“ˆ์— ๋„ฃ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ http://modules.gl/ ์„ ํ™•์ธ

@mrdoob @shi-314 browserify๋Š” browserify๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์˜ฌ๋ผ

grunt/gulp/etc์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ๋Š์ž„์—†์ด ์œ ๋™์ ์ด๋ฉฐ ๋‹ค์–‘ํ•œ ์˜๊ฒฌ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ•˜๋“ , ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ํ•˜๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•œ ์งˆ๋ฌธ์€ ์‚ฌ์šฉ์ž๊ฐ€ ThreeJS๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉฐ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์–ผ๋งˆ๋‚˜ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”๊ฐ€์ž…๋‹ˆ๋‹ค.

์ข€ ๋” ์ƒ๊ฐํ•ด๋ณธ ๊ฒฐ๊ณผ, ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์™„์ „ํžˆ ๋ฆฌํŒฉํ† ๋งํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ์€ _์ •๋ง_ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฝ”๋“œ๋Š” CommonJS ๋‚ด๋ณด๋‚ด๊ธฐ/์š”๊ตฌ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฝค ๊ฑฐ๋Œ€ํ•œ ์‚ฌ์—…์ด๋ฉฐ ๋งŽ์€ ์ถ”์•…ํ•œ ../../../math/Vector2 ๋“ฑ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด์ƒ์ ์ธ ์„ธ๊ณ„์—์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กฐ๊ฐํ™”๋˜์–ด three-scene ๊ฐ€ three-lights ๋“ฑ์—์„œ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฒ„์ „ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋‹จํŽธํ™”๋Š” ThreeJS์™€ ๊ฐ™์€ ํฐ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๋น„ํ˜„์‹ค์ ์ด๋ฉฐ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ž‘์€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์กฐ๊ฐํ™”ํ•˜์ง€ _์•Š์œผ๋ฉด_ ์‹œ๋งจํ‹ฑ ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ์•…๋ชฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์–ด๋Š ๊ณณ์—์„œ๋‚˜ ์ž‘์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ „์ฒด์— ๋Œ€ํ•œ ์ฃผ์š” ๋ฒ„์ „ ๋ฒ”ํ”„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ์ถ”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค: require('three/src/math/Vector2')

๋‚˜์˜ ์ œ์•ˆ? ์•ž์œผ๋กœ ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

  1. ์ž‘๊ฒŒ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. Vector/Quaternion, ์ƒ‰์ƒ ๋ณ€ํ™˜, ์‚ผ๊ฐ ์ธก๋Ÿ‰ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ํ•„์ˆ˜์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์„ ๊บผ๋‚ด์‹ญ์‹œ์˜ค. ์ด๊ฒƒ๋“ค์€ ThreeJS์˜ ๋ฒ”์œ„ ๋ฐ–์—์„œ ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— NPM์— ๋Œ€ํ•œ ์ข‹์€ ํ›„๋ณด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž์ฒด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ, ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ๋ฌธ์ œ ์ถ”์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ƒˆ ๊ธฐ๋Šฅ์ด๋‚˜ ์ข…์†์„ฑ(์˜ˆ: poly2tri/Tess2)๊ณผ ๊ฐ™์ด ์ƒˆ ์ฝ”๋“œ๋ฅผ ThreeJS์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์™€ NPM์„ ํ†ตํ•ด ์ข…์†์‹œํ‚ค๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์—ฌ๋Ÿฌ๋ถ„!

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

์—ฌ๊ธฐ์„œ @mrdoob ์— ๋™์˜

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ UMD( browserify --umd ) ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ๊ฐœ๋ฐœ์ž์˜ ์›Œํฌํ”Œ๋กœ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.

@mrdoob ์ข…์†์„ฑ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ์•„์ด๋””์–ด๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ ๋ฐ ๋นŒ๋“œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ˆ˜์‹ญ ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ๋Š” ๊ฒƒ์€ ์••๋„์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ํ˜„์žฌ ์‹œ์Šคํ…œ์€ ์ง€์† ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. A์˜ ํŒŒ์ผ์ด ๋‹ค๋ฅธ์— ๋”ฐ๋ผ ์–ธ์ œ๋“ ์ง€ ํ•˜๋‚˜, ์‚ฌ๋ƒฅ ๋ฐ - ๊ฒ€์ƒ‰ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋Š” ์ฐธ์กฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋‹ค. Browserify๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข…์†์„ฑ์ด ๋ช…์‹œ์ ์ด๋ฉฐ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@repsac ์ข…์†์„ฑ ์‹œ์Šคํ…œ์€ ์ „์—ญ ๋ฒ”์œ„, ๋กœ๋“œ ์ˆœ์„œ ์•…๋ชฝ์„ ํ”ผํ•˜๊ณ  ๋‹ค๋ฅธ ์ธ๊ธฐ ์žˆ๋Š” ์–ธ์–ด์™€ ์œ ์‚ฌํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์–ธ์–ด ์‚ฌ์šฉ์ž๊ฐ€ Three์— ๋” ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. var foo = require('./foo'); ๋Š” (๋Š์Šจํ•˜๊ฒŒ) C#์˜ using foo; ๋˜๋Š” Java์˜ import foo; ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๋ชจ๋“ˆํ™”๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ThreeJS์— ํ˜„์‹ค์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํฌํฌ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ•˜์—ฌ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฐˆ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค, ์ •๋ง๋กœ. ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ugly: require('three/src/math/Vector2')

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

์ด ์ž‘์—…์˜ ์ฃผ์š” ์ด์ ์€ ๊ฒฐ๊ณผ ๋นŒ๋“œ ํฌ๊ธฐ๊ฐ€ ์ „์ฒด Three.js ํฌ๊ธฐ์˜ ์•„์ฃผ ์ž‘์€ ๋ถ€๋ถ„์ผ ๊ฒƒ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์ฐธ์กฐ๋œ ํ•ญ๋ชฉ๊ณผ ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์˜์กดํ•˜๋Š” ํ•ญ๋ชฉ๋งŒ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์„ ์ฐธ์กฐํ•˜๊ณ  ๋ชจ๋‘ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ๋Š” ๋„ˆ๋ฌด ๋”์ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์˜ˆ, ์›น ์ฝ”๋”ฉ์€ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์‹คํ—˜์„ ๊ณ„์†...

์šฐ๋ฆฌ์˜ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค..

npm install three-scene three-perspective-camera three-webgl-renderer three-cube-geometry three-mesh-basic-material three-mesh three-raf

์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ...

// import our dependencies..
var Scene = require('three-scene'),
  Camera = require('three-perspective-camera'),
  Renderer = require('three-webgl-renderer'),
  CubeGeometry = require('three-cube-geometry'),
  MeshBasicMaterial = require('three-mesh-basic-material'),
  Mesh = require('three-mesh'),
  requestAnimationFrame = require('three-raf');

// set up our scene...
var scene = new Scene();
var camera = new Camera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
var renderer = new Renderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// create the cube...
var geometry = new CubeGeometry(1, 1, 1);
var material = new MeshBasicMaterial({color: 0x00ff00});
var cube = new Mesh(geometry, material);
scene.add(cube);
// position the camera...
camera.position.z = 5;
// animate the cube..
var render = function () {
  requestAnimationFrame(render);
  cube.rotation.x += 0.1;
  cube.rotation.y += 0.1;
  renderer.render(scene, camera);
};
// begin!
render();

๊ทธ๋Ÿฐ ๋‹ค์Œ ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜์‹ญ์‹œ์˜ค.

browserify entry.js -o scripts/hello-world.js

๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ ํŽ˜์ด์ง€์— ํฌํ•จํ•˜์‹ญ์‹œ์˜ค

<script src="/scripts/hello-world.js" type="text/javascript"></script>

ํ•„์š”ํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์„ ์ฐธ์กฐํ•˜๊ณ  ๋ชจ๋‘ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ๋Š” ๋„ˆ๋ฌด ๋”์ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Three๊ฐ€ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด browserify๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ”„๋กœ์ ํŠธ์—์„œ browserify๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. 3๊ฐœ๋Š” ์ง€๊ธˆ๊ณผ ๊ฐ™์ด ๊ธ€๋กœ๋ฒŒ THREE ๋กœ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...๋นŒ๋“œ ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ณ  ํ•จ๊ป˜ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

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

์ฆ‰, ์ตœ์ข… ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ examples ๋Š” ์ „ํ˜€ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

<script src="three.min.js"></script>

<script>
var renderer = new THREE.WebGLRenderer();
</script>

๋ชจ๋“ˆ์‹ ๋นŒ๋“œ๋ฅผ ์ฐพ๊ณ  ์žˆ๋Š” ๋” ์•ผ์‹ฌ์ฐฌ ๊ฐœ๋ฐœ์ž, _๋˜๋Š”_ ThreeJS ์œ„์— ์žฅ๊ธฐ ์†”๋ฃจ์…˜์„ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž(์ฆ‰, ๋ฒ„์ „/์ข…์†์„ฑ ๊ด€๋ฆฌ ํ™œ์šฉ)์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
npm install three-vecmath --save

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฝ”๋“œ์—์„œ:

var Vector2 = require('three-vecmath').Vector2;

//.. do something with Vector2

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

๋‚˜๋Š” require() ์—‰๋ง์ด ๋‚˜์œ ์ƒ๊ฐ์ด๊ณ  ๋‚˜์œ ์ ˆ์ถฉ์•ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ three.js ์ฝ”๋“œ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๋Š” ๊ฒƒ์€ ๋” ๋‚˜์œ ์ƒ๊ฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•˜๋‚˜๋Š” ๋ฉ‹์ง„ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ํ’๋ฏธ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋” ๋‹จ์ˆœํ•œ(๊ทธ๋Ÿฌ๋‚˜ 2๊ธ‰) ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ํ’๋ฏธ.

@erno three.js ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“ˆ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋˜์ง€๋งŒ ํ˜„์žฌ ์„ค์ •๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์€ ๋นŒ๋“œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์ด์ ์€ three.js ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@kumavis - ์•„๋‹ˆ์š” @erno ๋Š” ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ๋†“์น˜์ง€ ์•Š์•˜์ง€๋งŒ three.js ๊ฐ€ ์š”๊ตฌ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค(*). ์˜ˆ๋ฅผ ๋“ค์–ด ๋ˆ„๊ตฐ๊ฐ€๋Š” ์„ธ ๊ฐ€์ง€ ์†Œ์Šค๋ฅผ ๋ชจ๋‘ ์‚ดํŽด๋ณธ ๋‹ค์Œ ์ผ๋ถ€ ํƒ€์‚ฌ ์˜ˆ์ œ๋ฅผ ๋ณด๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ฐจ์ด์ ์„ ๋ฐœ๊ฒฌํ•ฉ๋‹ˆ๋‹ค.

(*) ์šฐ๋ฆฌ๋Š” ์˜ค๋Š˜ ์ผ์ฐ irc์—์„œ ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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

@anton ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค . ์‚ฌ๋žŒ๋“ค์€ ์—ฌ๊ธฐ์—์„œ ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ฃผ๋กœ ์ตœ์ƒ์œ„ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์ง€๋งŒ( THREE ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ฑฐ), ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•ฝ๊ฐ„์˜ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์œ ํšจํ•œ ์šฐ๋ ค์ž…๋‹ˆ๋‹ค.

์–ธ์–ด๊ฐ€ ์ข€ ํ—ท๊ฐˆ๋ ธ๋˜ ๊ฒƒ ๊ฐ™์•„์š”.

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋” ๋‹จ์ˆœํ•œ(๊ทธ๋Ÿฌ๋‚˜ 2๊ธ‰) ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹จ์ง€ ๋นŒ๋“œ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„ค?

์ œ ์ดํ•ด๋กœ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์€ ์ƒ์ƒํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋ญ”๊ฐ€๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

antont, kumavis: ์—ฌ๊ธฐ ์ œ์•ˆ์€ require() ์Šคํƒ€์ผ ์ฝ”๋“œ๋ฅผ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ๋„ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. mattdesl์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค.

"๋ชจ๋“ˆ์‹ ๋นŒ๋“œ๋ฅผ ์ฐพ๊ณ  ์žˆ๋Š” ๋” ์•ผ์‹ฌ์ฐฌ ๊ฐœ๋ฐœ์ž ๋˜๋Š” ThreeJS ์œ„์— ์žฅ๊ธฐ์ ์ธ ์†”๋ฃจ์…˜์„ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž(์˜ˆ: ๋ฒ„์ „/์ข…์†์„ฑ ๊ด€๋ฆฌ ํ™œ์šฉ) [...]"

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

์ง€๊ธˆ์€ bower & browserify๊ฐ€ require๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์œ ์ผํ•œ ์†”๋ฃจ์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ๊ธฐ์„ฑ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ (ng-dependencies์™€ ๊ฐ™์€) ๊ทธ๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•œ ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๊ณ ํ†ต์„ ํ•ด๊ฒฐํ•˜๋Š” ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Google์˜ ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๋„๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์‚ฌ์šฉ์ž ์ธก์—์„œ ์ด๊ฒƒ์ด ๋„์›€์ด ๋ ๊นŒ์š”?
http://marcinwieprzkowicz.github.io/three.js-builder/

๊ฝค ํฅ๋ฏธ ๋กญ๋„ค์š” @erichlof :) @marcinwieprzkowicz ๊ฐ€ ์ด๊ฒƒ์„ ์†์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค... https://github.com/marcinwieprzkowicz/three.js-builder/blob/gh-pages/threejs-src/r66/modules.json

three.js๊ฐ€ commonjs ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ instanceof๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/mrdoob/three.js/blob/master/src/core/Geometry.js#L82

์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์†Œ์Šค ํŠธ๋ฆฌ์— ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— instanceof ๊ฒ€์‚ฌ๊ฐ€ ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ฐ„์— ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น instanceof ๊ฒ€์‚ฌ๋ฅผ Geometry.isGeometry(geom) ์Šคํƒ€์ผ ์ธํ„ฐํŽ˜์ด์Šค ๋’ค์˜ ๊ธฐ๋Šฅ ๊ฒ€์‚ฌ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด commonjs ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

git/three.js/src์—์„œ:

grep -r instanceof . | wc -l 
164

git/three.js/examples:

grep -r instanceof . | wc -l 
216

๋”ฐ๋ผ์„œ three.js์—๋Š” ์ด 380๊ฐœ์˜ instanceof ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ ๊ฐ€์žฅ ์ข‹์€ ๊ตฌํ˜„์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ตœ๊ทผ์— ๊ทธ ๋Œ€๋ถ€๋ถ„์„ ๋Œ€์ฒดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” type ์†์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ๊ทผ์— ๊ทธ ๋Œ€๋ถ€๋ถ„์„ ๋Œ€์ฒดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜• ์†์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง„! PR์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ธ๊ธฐ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ๋Š” https://github.com/facebook/react๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” (browserify๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š”) ๋…ธ๋“œ ์Šคํƒ€์ผ ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋˜์ง€๋งŒ grunt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ„ํ•ด ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ 3๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐ”๋‹๋ผ JS๋ฅผ ์ž‘์„ฑํ•˜๋Š” Three.js์˜ ์ˆœ์ˆ˜ํ•œ ์†Œ๋น„์ž๋Š” ์—ฌ์ „ํžˆ ๋นŒ๋“œ ํŒŒ์ผ์„ ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.
  2. Browserify๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Three.js์˜ ์†Œ๋น„์ž๋Š” Three.js๋ฅผ ํ”„๋กœ์ ํŠธ์˜ ์ข…์†์„ฑ์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ require ํŠน์ • ์ข…์†์„ฑ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์ข…์†์„ฑ ๊ด€๋ฆฌ์˜ ์ด์ ์€ ์ž˜ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ์ข…์†์„ฑ์ด ๋ช…์‹œ์ ์œผ๋กœ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด์ œ Three.js์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์กฐ์‚ฌ๋ฅผ ์ข€ ํ•ด๋ณด๋‹ˆ...

์–ด์ œ ์ €๋Š” Three.js ์†Œ์Šค ์ฝ”๋“œ๋ฅผ CommonJS require() ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๊ฐ„์˜ ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๋„๋ก ๋ณ€ํ™˜ ํ•˜๋Š” (๋‹ค์†Œ ์–ด๋ฆฌ์„์€) ์Šคํฌ๋ฆฝํŠธ ๋ฅผ ํ•จ๊ป˜ ํ•ดํ‚นํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด... ์ด๊ฒƒ์€:

  1. (WebGLRenderer์—์„œ) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์†Œ ์šฐ์Šค๊ฝ์Šค๋Ÿฌ์šด require ๋ฌธ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

var THREE = require('../Three.js'); require('../math/Color.js'); require('../math/Frustum.js'); require('../math/Matrix4.js'); require('../math/Vector3.js'); require('./webgl/WebGLExtensions.js'); require('./webgl/plugins/ShadowMapPlugin.js'); require('./webgl/plugins/SpritePlugin.js'); require('./webgl/plugins/LensFlarePlugin.js'); require('../core/BufferGeometry.js'); require('./WebGLRenderTargetCube.js'); require('../materials/MeshFaceMaterial.js'); require('../objects/Mesh.js'); require('../objects/PointCloud.js'); require('../objects/Line.js'); require('../cameras/Camera.js'); require('../objects/SkinnedMesh.js'); require('../scenes/Scene.js'); require('../objects/Group.js'); require('../lights/Light.js'); require('../objects/Sprite.js'); require('../objects/LensFlare.js'); require('../math/Matrix3.js'); require('../core/Geometry.js'); require('../extras/objects/ImmediateRenderObject.js'); require('../materials/MeshDepthMaterial.js'); require('../materials/MeshNormalMaterial.js'); require('../materials/MeshBasicMaterial.js'); require('../materials/MeshLambertMaterial.js'); require('../materials/MeshPhongMaterial.js'); require('../materials/LineBasicMaterial.js'); require('../materials/LineDashedMaterial.js'); require('../materials/PointCloudMaterial.js'); require('./shaders/ShaderLib.js'); require('./shaders/UniformsUtils.js'); require('../scenes/FogExp2.js'); require('./webgl/WebGLProgram.js'); require('../materials/ShaderMaterial.js'); require('../scenes/Fog.js'); require('../lights/SpotLight.js'); require('../lights/DirectionalLight.js'); require('../textures/CubeTexture.js'); require('../lights/AmbientLight.js'); require('../lights/PointLight.js'); require('../lights/HemisphereLight.js'); require('../math/Math.js'); require('../textures/DataTexture.js'); require('../textures/CompressedTexture.js');

WebGLRenderer(๋ฐ ๊ธฐํƒ€)๋ฅผ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ(atm ํŒŒ์ผ ๊ธธ์ด๊ฐ€ 6000์ค„ ์ด์ƒ)๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋“ฑ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. GLSL ์ฒญํฌ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. Atm ํ•ด๋‹น ํŒŒ์ผ ์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— THREE.ShaderChunk ๋กœ ์ปดํŒŒ์ผ๋œ ๋‹ค์Œ ๋Ÿฐํƒ€์ž„์— THREE.ShaderLib ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค( THREE.ShaderChunk ์˜ ๋ฐฐ์—ด์„ ๊ฒฐํ•ฉ). ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €ํ™” ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

React.js๋Š” commoner ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ์ฐธ์กฐํ•  ํ•„์š” ์—†์ด ๋ชจ๋“ˆ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  require GLSL ํŒŒ์ผ์„ JS ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@rasteiner https://github.com/stackgl/glslify ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ์žฅํ•˜๋Š” http://stack.gl ์ œํ’ˆ๊ตฐ์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ๋ชจ๋“ˆ๊ณผ "unixy" ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ƒ๋‹นํ•œ ๊ฒฝํ—˜์ด ์žˆ์—ˆ๊ณ  ์ง€๊ธˆ์€ ๋„ˆ๋ฌด ๋Šฆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋ชจ๋“ˆํ™” ๋˜๋Š” npm ๋ชจ๋“ˆ์„ ์œ„ํ•ด threejs๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์€ ๋น„ํ˜„์‹ค์ ์ธ ๋ชฉํ‘œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ชจ๋“ˆ์„ฑ/์žฌ์‚ฌ์šฉ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ํ•˜๊ณ  ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

  • NPM์— Blur/fxaa/etc์šฉ์œผ๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์…ฐ์ด๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ ์ข€ ๋ด:
    https://www.npmjs.org/package/three-shader-fxaa (์—”์ง„์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” glsl-fxaa ์‚ฌ์šฉ)
  • OrbitController ๋ฐ EffectComposer์™€ ๊ฐ™์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋„ ํ•„์š”์— ๋”ฐ๋ผ ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ:
    https://www.npmjs.org/package/three-orbit-controls
  • "three"์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ์ด ๋ชจ๋“ˆ์€ THREE๋ฅผ ์ทจํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ „์—ญ threejs ๋˜๋Š” commonjs์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฃผ์š” ๋ฒ„์ „์„ threejs ๋ฆด๋ฆฌ์Šค ๋ฒˆํ˜ธ์— ๋งž์ถ”๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. threejs์˜ ๋ชจ๋“  ์ƒˆ ๋ฒ„์ „์€ ๋งŽ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•˜๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜ํ•™์„ ๋‹ค๋ฃจ๋Š” ๋ชจ๋“ˆ์€ ๋ฐฐ์—ด์—์„œ ์ž‘๋™ํ•˜๊ณ  ๋ชจ๋“ˆ์‹ gl-vec3, gl-mat4 ๋“ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ทธ๋“ค์€ threejs ์™ธ๋ถ€์—์„œ ์ผ๋ฐ˜์ ์ด๊ณ  ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด threejs ์‚ฌ์šฉ์ž๋Š” ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ž˜ํ•‘/์–ธ๋ž˜ํ•‘์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. verlet-system, simple-path ๋“ฑ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • ์ง„์ •ํ•œ ๋ชจ๋“ˆ์‹ ๋˜๋Š” ์ž‘์€ webGL ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•ž์œผ๋กœ stackgl/glslify๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. GL ์ƒํƒœ๋ฅผ ์žฌ์„ค์ •ํ•˜๋Š” ํ•œ ThreeJS ๋‚ด์—์„œ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: https://www.npmjs.org/package/gl-sprite-text

๋‚ด ์ƒˆ ํ”„๋กœ์ ํŠธ๋Š” ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด npm์—์„œ "3"์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ThreeJS๊ฐ€ ๋ฆด๋ฆฌ์Šค ๋ฒˆํ˜ธ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์‹์ ์œผ๋กœ npm์— ๋นŒ๋“œ๋ฅผ ๊ฒŒ์‹œํ•˜๋ฉด ์ •๋ง ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”์‹ : ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ/๋ชจ๋“ˆ์‹ ์…ฐ์ด๋”๋ฅผ ์›Œํฌํ”Œ๋กœ์— ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ:
https://gist.github.com/mattdesl/b04c90306ee0d2a412ab

๋‚ด iPhone์—์„œ ๋ณด๋‚ธ

2014๋…„ 11์›” 20์ผ ์˜ค์ „ 7์‹œ 42๋ถ„์— aaron [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@rasteiner https://github.com/stackgl/glslify ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ์žฅํ•˜๋Š” http://stack.gl ์ œํ’ˆ๊ตฐ์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.

Browserify์™€ ํ•จ๊ป˜ Three.js๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ณ  ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ, ์ œ๊ฐ€ ์ง์ ‘ ์„ค์ •ํ•œ ๋ฐฉ๋ฒ•์€ browserify-shim ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_"๋‹น์‹ ์€ ๋•Œ๋•Œ๋กœ a) ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ์œผ๋กœ ๋…ธ์ถœ"_์— ๋Œ€ํ•œ README ์„น์…˜์— ๋”ฐ๋ผ Three.js์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•˜๊ณ  ์ „์—ญ THREE ๋ณ€์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์ œ๊ฐ€ ์Šค์Šค๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ๋˜ ๋ถ€๋ถ„์€ ColladaLoader, OrbitControls ๋“ฑ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.

package.json์—์„œ:

    "browser": {
        "three": "bower_components/threejs/build/three.js"
    },
    "browserify-shim": "browserify-shim-config.js",
    "browserify": {
        "transform": [ "browserify-shim" ]
    }

Browserify-shim-config.js:

    module.exports = {
        "three": { exports: "global:THREE" },
        "./vendor/threejs-extras/ColladaLoader.js": { depends: {"three": null}, exports: "global:THREE.ColladaLoader" },
        "./vendor/threejs-extras/OrbitControls.js": { depends: {"three": null}, exports: "global:THREE.OrbitControls" }
    };

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚ด ์ž์‹ ์˜ ์Šคํฌ๋ฆฝํŠธ์ธ main.js์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    require('../vendor/threejs-extras/ColladaLoader.js');
    require('../vendor/threejs-extras/OrbitControls.js');

    var loader = new THREE.ColladaLoader(),
        controls = new THREE.OrbitControls(camera);
...

Browserify๋Š” ๋ฐ”์ดํŠธ์—์„œ๋„ ์ˆ˜์ •ํ•  ๋•Œ ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ browserify๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ THREE.js๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ํŒจํ‚นํ•œ ๋‹ค์Œ ๊ฒฝ๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ 2์ดˆ ์ด์ƒ์ด ๊ฑธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค livereload๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค.

livereload ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ์ผ๋ฐ˜์ ์œผ๋กœ

watchify๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ €์žฅํ•  ๋•Œ watchify ๋ฐ beefy์˜ livereload๋Š” ์ด์ „/์บ์‹œ๋œ ๋ฒ„์ „์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ง™๊ฒŒ๋„ browserify๋Š” ์ด๋ฏธ ๊ฝค ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@ChiChou --noparse=three ๋กœ ๋ธŒ๋ผ์šฐ์ €ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ browserify ๋ฒˆ๋“ค ๋‹จ๊ณ„๋ฅผ 1000ms์—์„œ 500ms๋กœ ๋‚ฎ์ถ”๋Š”๋ฐ, ์ด๋Š” ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ ๋Š๋‚Œ์„ ์ฃผ๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

@rasteiner three.js ์ƒํ˜ธ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ๋น„๊ณต์‹ ์—ฐ๊ตฌ์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ ๋ฐฉ๋Œ€ํ•œ deps ๋ชฉ๋ก์€ ๋ณด๊ธฐ ํ‰ํ•œ ์ฝ”๋“œ์ด์ง€๋งŒ ์‹ค์ œ๋กœ ๊ทธ ์ถ”ํ•จ์€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์กด์žฌํ•˜๋ฉฐ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Browserify์˜ ๊ฐ•์ ์€ ๋”๋Ÿฌ์šด ์„ธํƒ๋ฌผ์„ ํ™˜๊ธฐ์‹œํ‚ค๊ณ  ๋œ ์—‰ํ‚จ ์‹œ์Šคํ…œ์„ ์ถ”๊ตฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Three.js์—๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์œ ํ˜•์„ ์ธ์‹ํ•˜๊ณ  ํ•ด๋‹น ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณณ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์œ ํ˜• ์ข…์† ์ฝ”๋“œ๋Š” ์œ ํ˜• ์ž์ฒด๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์—… ์ค‘์ธ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์„ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ WebGLRenderer ์˜ ์š”์•ฝ๋œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

if ( texture instanceof THREE.DataTexture ) {
  // ...
} else if ( texture instanceof THREE.CompressedTexture ) {
  // ...
} else { // regular Texture (image, video, canvas)
  // ...
}

๋” ๋งŽ์€ ํ˜•์‹์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค

texture.processTexImage( _gl, mipmaps, otherData )

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

๋ธŒ๋ผ์šฐ์ €ํ™” ์•„ํ‚คํ…์ฒ˜๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ํ™•์‹คํžˆ ๊ฐˆ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. UMD ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด THREE.js๋ฅผ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ WebGLRenderer๋ฅผ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋‹ค์†Œ ๋‹จ์ผํ•˜๊ณ  ๋ฌด์„ญ๊ฒŒ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์—ฌ๊ธฐ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š” ์ง€์ ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/coballast/three.js/tree/browserify-build-system

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

๋‹ค์Œ์€ @coballast ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ž…๋‹ˆ๋‹ค.

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

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

์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด:

  • three.js src ๋ณ€ํ™˜ ์Šคํฌ๋ฆฝํŠธ ์ œ๊ณต(์˜ˆ: browserifyify.js )
  • ๋ณ€ํ™˜ ํ”„๋กœ์„ธ์Šค์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ ์ œ๊ณต
  • ์ƒˆ ๋นŒ๋“œ ์‹œ์Šคํ…œ์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ ์ œ๊ณต
  • ๋ณ€ํ™˜ ํ›„ ํ…Œ์ŠคํŠธ ์‹คํ–‰
  • ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์กด ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํฌํ•จํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

...๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์—๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•  ํ‘ธ์‹œ ๋ฒ„ํŠผ ๋ณ€ํ™˜์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹จ์ˆœํ•จ์€ ์ด๋ฐ์˜ฌ๋กœ๊ธฐ์  ๋…ผ์Ÿ์ด ์Šน๋ฆฌํ•  ๋•Œ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฌํ•œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋กœ์˜ ๊ทผ๋ณธ์ ์ธ ์•„ํ‚คํ…์ฒ˜ ์ „ํ™˜์— ๋Œ€ํ•œ ์ด ๊ฟˆ๊พธ๋Š” ๊ฐœ๋…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

@coballast ๋ฅผ ์œ„ํ•ด src/Three.js๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋˜๋Œ๋ฆด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒˆ ๋ถ„๊ธฐ ๋˜๋Š” ๊ฐ•์ œ ํ‘ธ์‹œ๋ฅผ ํ†ตํ•ด ๋ถ„๊ธฐ ๊ธฐ๋ก์—์„œ ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

@coballast ๋ณ€ํ™˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ three.js ์˜ ํฌํฌ๊ฐ€ ์•„๋‹ˆ๋ผ three.js ๊ฐœ๋ฐœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์™ธ๋ถ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ด๊ณ  ์†Œ์Šค๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค three.js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ ์—ฌ๊ธฐ์—๋Š” ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ผ๊ด€๋œ ์Šคํƒ€์ผ์„ ์ž๋™์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ์ •์  ๋ถ„์„ ํ•ญ๋ชฉ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@coballast๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.
์ž๋™ํ™”๋œ ์ฝ”๋“œ ์žฌ์ž‘์„ฑ์„ ์œ„ํ•œ ํ’๋ถ€ํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: escodegen ) . ์˜๊ฒฌ ๋“ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
threejs-conversion-utility ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@coballast ๋Š” ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ๋Œ€ํ•œ ์˜ˆ๋ฆฌํ•œ ์ดˆ์ ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

@kumavis ์™„๋ฃŒํ•œ

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

๊ทธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ์ถœ๋ ฅ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค ^^

@coballast ๋งํฌ ์ €์žฅ์†Œ๋Š” ์ด ์‹œ์ ์—์„œ ๋น„์–ด ์žˆ๋”๋ผ๋„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฑฐ๊ธฐ์—์„œ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/coballast/threejs-browserify-conversion-utility

์ฝ”๋“œ๊ฐ€ ์—‰๋ง์ž…๋‹ˆ๋‹ค. ๊ณง ์ •๋ฆฌ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ„๋‹ค! :๋กœ์ผ“:

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

@coballast ๋„ค, ๋ฌธ์ œ๋ฅผ TODO๋กœ ์ œ์ถœํ•ด ์ฃผ์„ธ์š”. ์ €๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ตœ๋Œ€ํ•œ ์ฐธ์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. #6241 ์ฐธ์กฐ

๋‹ค์Œ์€ ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์ผ์— ๋Œ€ํ•œ ๋ถ„์„์ž…๋‹ˆ๋‹ค. https://github.com/coballast/threejs-browserify-conversion-utility/issues/9#issuecomment -83147463

Browserify๋Š” ๋””์ž์ธ์œผ๋กœ ์ธํ•ด ์ตœ์†Œํ•œ ์ „์†ก์ด ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ ๋น„์šฉ์ด ๋ถ€ํ’€๋ ค์ง€๊ณ (๋ฐ์ดํ„ฐ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?) ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ๋‘ ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ ํŒŒ์ผ์„ ์ˆ˜๋ฐ˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์—์„œ ๋ฌธ์„œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ์ธก js์˜ ์ผ๋ฐ˜์ ์ธ ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ์— browserify์— ๊ฒฐํ•จ์ด ์žˆ๊ณ  ์ž์ฒด์ ์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ threejs์™€ ๊ฐ™์€ ๊ฒƒ์€ ๊ณ ์‚ฌํ•˜๊ณ  ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ๊ฑฐ์˜ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

์–ด๋–ค ์ด์œ ๋กœ "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์—์„œ ๋ฌธ์„œ"๋ฅผ ๋ถ„๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ์—ฌ์ „ํžˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ง€๊ธˆ์ฒ˜๋Ÿผ ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --standalone ๋ฐ --exclude ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

Browserify๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒ€์ฆ๋œ ๋ชจ๋“ˆ ์ •์˜ API(CommonJS)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. threejs ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ฝ”๋“œ ๋ช…ํ™•์„ฑ ๋ฐ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ๋ณธ์งˆ์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋” ํฐ ์ƒํƒœ๊ณ„(npm)์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. stackgl family), ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ CommonJS๋กœ ๊ฐ•์ œํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ์–ธ๊ธ‰ํ•œ ๋‹จ์ ์€ ์•„๋‹™๋‹ˆ๋‹ค.

three.js ๋ฐ three.min.js๋Š” ํ”„๋ก์‹œ, ์ผ๋ฐ˜ ๋ชจ๋ฐ”์ผ ์†”๋ฃจ์…˜ ๋˜๋Š” ์บ์‹ฑ ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ์ „์†ก(๋ฐ์ดํ„ฐ)์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์„œ ํŠน์ • ์ฝ”๋“œ๋กœ threejs ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ  ์ง‘๊ณ„ํ•˜๋Š” ์ˆœ๊ฐ„ ์บ์‹ฑ์€ ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Browserify๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ