Three.js: ์ˆœํ™˜ ์ข…์†์„ฑ

์— ๋งŒ๋“  2015๋…„ 03์›” 16์ผ  ยท  81์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

์•ˆ๋…• ๋ชจ๋‘๋“ค.

@kumavis ์™€ ์ €๋Š” THREE.js๋ฅผ browserify ์•„ํ‚คํ…์ฒ˜๋กœ ์˜ฎ๊ธฐ๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ browserify ๋นŒ๋“œ ์‹œ์Šคํ…œ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๋งˆ์‹œ๋ฉฐ three.min.js๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์ ๊นŒ์ง€ ์ข‹์€ ์ง„์ „์„ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์˜ˆ์ œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด commonjs์™€ ๋‹ฌ๋ฆฌ browserify๋Š” ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์—์„œ ์ข…์† ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋Œ€ํ™”ํ˜• ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์ด ์—‰ํ‚ค์ง€ ์•Š๋Š” ํ•œ, ์šฐ๋ฆฌ๋Š” THREE.js๋ฅผ browserify ๋นŒ๋“œ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

Suggestion

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

@Mugen87 ์™€, 5๋…„์ฐจ! ๋“œ๋””์–ด ์„ฑ๊ณต์„ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค :fire: :clap:
๊ทธ ๋‹น์‹œ์—๋Š” ๊ทธ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค :smile_cat:

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

ํ’€์–ด์•ผ ํ•  ๋งค๋“ญ์ด๋‹ค.
http://jsbin.com/medezu/2/edit?html,js ,์ถœ๋ ฅ
image

@coballast ์ข…์†์„ฑ json์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ three.min.js ํŒŒ์ผ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์„ธ์š”. Three.js๋ฅผ Browserfy ๋‚ด์—์„œ ๊ฐœ๋ณ„ ํŒŒ์ผ๋กœ ๋ถ„ํ•ดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ด์ต ์—†์ด ์‚ถ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ๋ฟ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ๊ฒฝํ—˜์— ๋น„์ถ”์–ด ์šฐ๋ฆฌ๊ฐ€ three.js์˜ npm ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋งํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋‹จ์ผ ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•ํ•˜๊ณ  CommonJS ์Šคํƒ€์ผ ๋ชจ๋“ˆ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ browserfy์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์ด ๋งค๋“ญ์„ ํ’€ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@kumavis ๋ฐฉ๊ธˆ ์ข…์†์„ฑ ๊ตฌ์กฐ๋ฅผ ๋คํ”„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

var fs = require('fs-extra');
var unique = require('uniq');
var util = require('util');

function getRequiredObjects(dependencies){
  var result = [];
  for(var i = 0; i < dependencies.usedObjects.length; i++){
    var object = dependencies.usedObjects[i];
    if(dependencies.definedObjects.indexOf(object) == -1)
      result.push(object);
  }

  return result;
};

var dependencies = JSON.parse(fs.readFileSync('./dependencies.json'));

var objects = [];
for(var f in dependencies){
  objects = objects.concat(dependencies[f].usedObjects);
  objects = objects.concat(dependencies[f].definedObjects);
}

objects = unique(objects);


var nodes = objects.map(function(o){
  return {data: {id: o} };
});

var edges = [];
for(var f in dependencies){
  var dependency = dependencies[f];
  var requiredObjects = getRequiredObjects(dependency);
  for(var j = 0; j < dependency.definedObjects.length; j++){
    for(var k = 0; k < requiredObjects.length; k++){
      edges.push({ data: { source: dependency.definedObjects[j], target: requiredObjects[k] } });
    }
  }
}

var graph = {nodes: nodes, edges: edges};

var eliminateImpossibleCycleNodes = function(graph){
  graph.nodes = graph.nodes.filter(function(node){
    var source_edge = null;
    var dest_edge = null;
    for(var i = 0; i < graph.edges.length; i++){
      if(graph.edges[i].data.source == node.data.id)
        source_edge = graph.edges[i];
      if(graph.edges[i].data.target == node.data.id)
        dest_edge = graph.edges[i];
    }

    if(source_edge != null && dest_edge != null)
      return true;
    else
      return false;
  });

  graph.edges = graph.edges.filter(function(edge){
    var source_exists = false, target_exists = false;
    for(var i = 0; i < graph.nodes.length; i++){
      if(edge.data.source == graph.nodes[i].data.id)
        source_exists = true;
      if(edge.data.target == graph.nodes[i].data.id)
        target_exists = true;
    }

    return source_exists && target_exists;
  });
};

for(var i = 0; i < 500; i++)
  eliminateImpossibleCycleNodes(graph)


console.log(JSON.stringify(graph));

@bhouston ์€ three.js ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ƒํƒœ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฏธ๋ฌ˜ํ•œ ํ•ฉ๋ณ‘์ฆ์„ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ํ•˜์ž๋ฉด, ์—ฌ๊ธฐ์„œ ๋‚˜๋Š” ๊ตฌํ˜„ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ถ€์ž‘์šฉ์— ๋Œ€ํ•ด ๋น„ํŒ์ ์ž…๋‹ˆ๋‹ค.

Vector3 ๋ฐ Matrix4 ๋Š” ์„œ๋กœ๋ฅผ ์ž…๋ ฅ ๋˜๋Š” ์ถœ๋ ฅ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ๋ฒ”์œ„๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœํ™˜ ์ข…์†์„ฑ์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค Three.js์— ๊ณตํ†ต์ ์ธ ์Šคํƒ€์ผ๋กœ ๊ตฌํ˜„๋˜์–ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ž˜์น˜ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋„๋ก IIFE๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Matrix4#lookAt ๋Š” ํ•จ์ˆ˜ ์ •์˜์˜ ์ผ๋ถ€๋กœ ์Šคํฌ๋ž˜์น˜๋ฅผ ์ฆ‰์‹œ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

lookAt: function () {

  var x = new THREE.Vector3();
  var y = new THREE.Vector3();
  var z = new THREE.Vector3();

  return function ( eye, target, up ) {
    /* ... */

๊ทธ๋Ÿฌ๋‚˜ Vector3#project ๋Š” ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ ์Šคํฌ๋ž˜์น˜๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

project: function () {

  var matrix;

  return function ( camera ) {

    if ( matrix === undefined ) matrix = new THREE.Matrix4();

    /* ... */

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

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

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

https://github.com/openexr/openexr/tree/master/IlmBase/Imath

Math์™€ Vec์ด ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ด€์ฐฐ:

Material ์—๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์™€ ์–‘๋ฐฉํ–ฅ dep๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
image
๋ณด๊ธฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ต์ง€๋งŒ Geometry s๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ ์ข‹์€ ๋‹จ๋ฐฉํ–ฅ dep๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
image
Light s ์™€ Camera s ๋Š” ๋น„์Šทํ•œ ์ƒํ™ฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค -- ๊ทธ๋“ค์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ๊ด€ํ•ด์„œ๋Š” ์ข‹์ง€๋งŒ Object3D ์˜ ์˜์กด์„ฑ์€ _๊ทธ๋“ค์— ๋Œ€ํ•œ_ ๋ถˆํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
image
image
Curve s Path s Line s ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ Shape ๋Š” ์•ฝ๊ฐ„ ์—‰์ผœ ์žˆ์Šต๋‹ˆ๋‹ค.
image

@coballast ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ํ†ต์ฐฐ๋ ฅ์ž…๋‹ˆ๋‹ค.

๋Œ“๊ธ€์„ ์œ„ํ•ด ์ €๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค :)

Btw, ์˜ˆ๋ฅผ ๋“ค์–ด Material์ด MeshDepthMaterial์— ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๋‹ค

if ( this instanceof THREE.MeshDepthMaterial )

๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ

if ( this.type == 'MeshDepthMaterial' )

๊ทธ๋ฆฌ๊ณ  ์งœ์ž” - ์˜์กด์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌด์„œ์šด ๊ทธ๋ž˜ํ”„์˜ ์ ˆ๋ฐ˜์€ ๊ฐ™์€ ์ˆ˜์ค€์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์žฌ๋ฏธ์žˆ๋Š” ์ ์€ ์ด ์ข…์†์„ฑ์ด ๋‹จ์ผ toJSON ๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  MeshDepthMaterial์—์„œ ๊ต์ฒดํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๊นŒ? ๋ญ”๊ฐ€

THREE.MeshDepthMaterial.prototype.toJSON =  function () {
    var output = THREE.Material.prototype.toJSON.apply(this);
    if ( this.blending !== THREE.NormalBlending ) output.blending = this.blending;
    if ( this.side !== THREE.FrontSide ) output.side = this.side;

@makc ์ผ๋ฐ˜์ ์œผ๋กœ instanceof ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ํŠน์ • ํด๋ž˜์Šค ์ž์ฒด๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋งŽ์€ ๋งค๋“ญ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

AMD๋Š” ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ ES6 ๋ชจ๋“ˆ์€ https://github.com/ModuleLoader/es6-module-loader/wiki/Circular-References-&-Bindings ๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ข…์†์„ฑ ํ•ด๊ฒฐ ๋ฌธ์ œ(๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๋กœ๋” ๊ตฌํ˜„์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ(์˜ˆ: system.js ))๋ฅผ ์ œ์™ธํ•˜๊ณ  three.js์—์„œ ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ ๋‹จ๊ณ„์ ์œผ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฆด๋ฆฌ์Šค์—์„œ ๋งŽ์€ API ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์ด ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

instanceof ์‚ฌ๋ก€(๋Œ€๋ถ€๋ถ„)์˜ ๊ฒฝ์šฐ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—†์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

@ zz85 ์ˆœํ™˜ ์ข…์†์„ฑ ๋ฌธ์ œ๋„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ์ˆœํ™˜ ์ฐธ์กฐ ํŒŒ์ผ ๋‚ด๋ถ€์— ํŠน์ • ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ฃผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

6252๋Š” Material ๋ฐ Object3D ์— ๋Œ€ํ•œ ๋งŽ์€ ์ˆœํ™˜ dep๋ฅผ ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Mesh ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ด€๋ จ ์—†๋Š” dep๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋ฏธ์นœ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
image

Object3D ๋ฐ Geometry ๊ฐ€ ์žˆ๋Š” ์›ํ˜• Object3D -> Mesh ์ฐธ์กฐ๋Š” ์œ„์˜ PR์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. Mesh -> Geometry ์ฐธ์กฐ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. b/c Mesh ๋Š” Geometry ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ณ„ ๋™์ž‘( Geometry / BufferGeometry )์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฌ์ „ํžˆ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Geometry -> Mesh ์ฐธ์กฐ๋Š” geometry.mergeMesh( mesh ) ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Geometry ๋Š” Mesh ๋ณด๋‹ค ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ฐœ๋…์ด๋ฏ€๋กœ mesh.mergeIntoGeometry( geo ) mergeMesh $ ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์ค‘ ์ผ๋ถ€๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ณ‘ํ•ฉ์„ ๋ฐ›์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ํ˜„์žฌ ์ƒํ™ฉ์„ ๋ฐ˜์˜ํ•˜๋„๋ก ๊ทธ๋ž˜ํ”„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@bhouston @gero3 ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ˆ˜์ค€์˜ ์œ ์šฉ์„ฑ/์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ˆœํ™˜ ์ข…์†์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ Vector3๋ฅผ ๋‚˜๋จธ์ง€ ์‹œ์Šคํ…œ๊ณผ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌ/๋ฌด์ง€ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  Matrix4 ๋ชจ๋“ˆ์—์„œ Matrix4๋ฅผ ์ˆ˜์šฉํ•˜๋„๋ก ํ”„๋กœํ† ํƒ€์ž…์„ ์ˆ˜์ •ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๊นŒ? ํ–‰๋ ฌ์€ ๋ฒกํ„ฐ๋ณด๋‹ค ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋…์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๊ณ ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœํ† ํƒ€์ž…๊ณผ ํด๋ž˜์Šค๊ฐ€ ๊ตฌ์„ฑ๋˜๋Š” ์ž˜ ์ •์˜๋œ ์ˆœ์„œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@bhouston @gero3 api๋ฅผ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆฌ์ €๋ฆฌ ์ฐ”๋Ÿฌ๋ณด๊ณ  ๋ญ์ง€.

์ˆ˜ํ•™ ๋ฌธ์ œ์— ๊ด€ํ•ด์„œ๋Š” ๋ชจ๋“  "์Šคํฌ๋ž˜์น˜ ํŒจ๋“œ"๋ฅผ ํ•œ ๊ณณ์— ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Vector3์™€ Matrix4๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜์ง€ ์•Š๋Š” 3js์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ ๊ทธ๋ž˜ํ”„๋Š” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ฑ๋Šฅ์ด๋‚˜ API๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์†”๋ฃจ์…˜์ด ์žˆ๋‹ค๋ฉด ์ €๋Š” ์ „์ ์œผ๋กœ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@coballast ๋Š” API ๋ณ€๊ฒฝ ์—†์ด ์ฃผ๊ธฐ์  dep๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ b/c๋Š” ๋‘˜ ๋‹ค ๋‹ค๋ฅธ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Vector3 Matrix4

Browserify compat์˜ ๊ฒฝ์šฐ, ์šฐ๋ฆฌ์˜ ์œ ์ผํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์Šคํฌ๋ž˜์น˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ํด๋ž˜์Šค ์ •์˜ ์‹œ๊ฐ„ ๋ฐ–์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฒ˜์Œ ์‹คํ–‰ ์‹œ ์ธ์Šคํ„ด์Šคํ™”๋˜๋„๋ก ํ•จ). ์ด๊ฒƒ์„ ๊ฒŒ์œผ๋ฅด๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค . ์ด๋Š” API ๋˜๋Š” ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋ณ€ํ™”๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@kumavis ์•„! ์˜ˆ. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ 3๊ฐœ๋ฅผ require ๊ตฌ์กฐ๋กœ ๋” ์ž‘์€ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ์ „์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  1. THREE๋Š” ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ ๋นŒ๋“œ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด react-bootstrap ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ชจ๋“ˆ์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ์ง€ ์•Š๋Š” var Alert = require('react-bootstrap/lib/Alert'); ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. $#$2 THREE.OrbitControls #$ ์— 3๊ฐœ์˜ ์ „์—ญ ๊ฐœ์ฒด ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” OrbitControls.js ์™€ ๊ฐ™์€ ์ผ๋ถ€ "ํ”Œ๋Ÿฌ๊ทธ์ธ"์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์˜ ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํ•„์š”ํ•œ ํŒŒ์ผ์ด ์•„๋‹Œ 3๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์•ˆํ‹ฐํŒจํ„ด์ž…๋‹ˆ๋‹ค. THREE๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ๋„ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ•ญ์ƒ THREE ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ ํŠน์ • THREE ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

THREE.OrbitControls์— ์ž์‹ ์„ ๋ฐฐ์น˜

ํ•˜์ง€๋งŒ 3js์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

@DelvarWorld ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ 3๊ฐœ๋ฅผ require ๊ตฌ์กฐ๋กœ ๋” ์ž‘์€ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ์ „์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

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

@makc ์ฒ˜๋Ÿผ ์ €๋„ @DelvarWorld ์˜ THREE ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ๋ง์ž๋Š” ์ œ์•ˆ์— ๋Œ€ํ•ด ์˜์•„ํ•ดํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๋Œ€์‹  ์–ด๋””์— / ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๋‚˜์—๊ฒŒ๋Š” ๋ชจ๋“  ๋ถ€๋ถ„(๋ฐ ์ผ๋ถ€ ํ™•์žฅ/ํ”Œ๋Ÿฌ๊ทธ์ธ)์ด ์žˆ๋Š” ํ•˜๋‚˜์˜ ์ „์—ญ ๊ฐœ์ฒด์ธ THREE๋งŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์€ ํŒจํ„ด์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ €๋Š” @DelvarWorld ์™€ ํ•จ๊ป˜ put-it-on-global ๊ธฐ์ˆ ์ด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฑด๊ฐ•์— ์ข‹์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ ์ž์ฒด์— ์ ์šฉํ•˜๋Š” ์ผ์ข…์˜ ๋ฏธ๋ฌ˜ํ•œ ๋…ผ์Ÿ์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์ˆจ๊ฒจ์ง„ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„ ๋ฐ ์ „์—ญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•.

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

๋ฐ˜๋Œ€ ์ฃผ์žฅ์€ THREE.js ์žฅ๋ฉด json์„ ์—ญ์ง๋ ฌํ™”ํ•  ๋•Œ ํ•ญ๋ชฉ์ด THREE[ obj.type ] ์™€ ๊ฐ™์ด ์ „์—ญ์—์„œ ๋Œ์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด๋กœ ํด๋ž˜์Šค๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ญ์ง๋ ฌํ™”ํ•˜๊ธฐ ์ „์— THREE ์— ์ •์˜ํ•˜๋Š” ํ•œ ํ‘œ์ค€ three.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—†๋Š” ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. THREE ์ „์—ญ ์—†์ด ์ด ๋™์ž‘์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ญ์ง๋ ฌํ™”ํ•˜๊ธฐ ์ „์— THREE์—์„œ ์ •์˜ํ•˜๋Š” ํ•œ ํ‘œ์ค€ three.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—†๋Š” ํด๋ž˜์Šค์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. THREE ์ „์—ญ ์—†์ด ์ด ๋™์ž‘์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๋ชจ๋“ˆ์ธ ๊ฒฝ์šฐ ์ด ํŒจํ„ด(๋˜๋Š” ์ผ๋ถ€ ๋ณ€ํ˜•)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var objectType = require( "THREE." + obj.type );

๋ชจ๋“ˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ ES6์—๋Š” ๋งŽ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ThreeJS์˜ ๋ชจ๋“ˆ์„ฑ์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

var THREE = {
    Geometry: require("./geometry"),

๋“ฑ, ์—ฌ์ „ํžˆ ์ดˆ๋ณด์ž์—๊ฒŒ ์œ ์šฉํ•˜๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ๋นŒ๋“œ์—์„œ npm ๋ฐ requirejs/browserify/webpack์˜ ์„ธ ๊ฐ€์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var Scene = require("three/scene"),
     Camera = require("three/camera"),

๋“ฑ, ํด๋ผ์ด์–ธํŠธ ํฌ๊ธฐ ๋ฒˆ๋“ค์— ๋‚ด์žฅ๋œ 3๊ฐœ์˜ ํฌ๊ธฐ ์ค‘ ์ผ๋ถ€๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๊ฐ€์ง€ ์ค‘ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒƒ์ด "ํ•ต์‹ฌ"์ธ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ three๊ฐ€ require ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“  ํ˜„๋Œ€์ ์ธ ํŒจํ„ด์€ ๋ชจ๋“ˆ์„ ํ•„์š”๋กœ ํ•˜๋ฉฐ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๋Š” ๋Œ€์‹ (๊ธ€๋กœ๋ฒŒ THREE ์ˆ˜์ •, ์ž˜๋ชป๋œ) ์ฝ”๋“œ๋Š” ๋…๋ฆฝ์ ์ด๊ณ  ๋ชจ๋“ˆ์‹์ด๋ฉฐ require ๋ฌธ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด React ์†Œ์Šค ์ฝ”๋“œ .

require/module ๊ตฌ๋ฌธ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ฃผ์žฅ์„ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ์— ์ด์— ๋Œ€ํ•œ ์ข‹์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด OrbitControls์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด THREE ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@DelvarWorld ES6์€ ๋งค์šฐ ๊ตฌ์ฒด์ ์ด๊ณ  ๋…ํŠนํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ JavaScript์— ๊ณต์‹์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋„์ž…ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

http://www.2ality.com/2014/09/es6-modules-final.html

@bhouston ์˜ค ์˜ˆ ์™„์ „ํžˆ, ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“ˆ ํŒจํ„ด์„ ์ง€์›ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด import vs import(๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ)์— ๋ถˆ๊ฐ€์ง€๋ก ์ ์ž…๋‹ˆ๋‹ค.

@bhouston @DelvarWorld @kumavis ๋‚ด ์žฅ๊ธฐ ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜๋Š” commonjs/amd ๋ชจ๋“ˆ์„ ์ˆ˜์šฉํ•˜๊ณ  es6์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™ es5 -> es6 ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋“ฑ๋“ฑ. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ‘œ์ค€์„ ๋”ฐ๋ผ์žก์œผ๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•˜๋Š” ๋™์•ˆ es6ify์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €ํ™” ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์ˆ˜์ค€์—์„œ THREE๋ฅผ browserify๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์€ ๊ทธ๋Ÿฌํ•œ ๋„๊ตฌ์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

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

@coballast https://github.com/mrdoob/three.js/pull/6252 ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๋งŽ์€ ์ˆœํ™˜ dep๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊นŠ์ด ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๋ณ€ํ™˜ ๋„๊ตฌ ์ €์žฅ์†Œ์—์„œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Vector3 Matrix4 ์˜ ์Šคํฌ๋ž˜์น˜ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ ๋Š๋ฆฌ๊ฒŒ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์›๋ด‰์‚ฌ ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ? ๋นจ๋ผ์•ผ ํ•œ๋‹ค

๊ทธ๋ž˜ํ”„๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. http://jsbin.com/medezu/3/

๋‹ค์Œ์€ ์Šคํฌ๋ฆฐ์ƒท์ž…๋‹ˆ๋‹ค.

snapshot3

์ˆ˜๋งŽ์€ Object3D circ dep๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Œ์„ ๋ณด๊ณ ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ž˜ํ–ˆ์–ด @kumavis!

์™€์šฐ ๊ฐ™์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์ธ๊ฐ€์š”? ๋ฏธ์นœ

์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ ๋ถ€๋ถ„์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„๋งŒ ๋ณด์•„๋„ Shape ์™€ Geometry ๋Š” ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ํŠธ๋ฆฌ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

@coballast ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

Vector3 Matrix4์˜ ์Šคํฌ๋ž˜์น˜ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ ๋Š๋ฆฌ๊ฒŒ ์ •์˜

์ž๋™ ๋ณ€๊ฒฝ์ด ์•„๋‹Œ ์—…์ŠคํŠธ๋ฆผ dev ์— ๋Œ€ํ•œ PR์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฌธ์ œ ์ œ๋ชฉ์„ "์‹ฌ๊ฐํ•œ ์ˆœํ™˜ ์ข…์†์„ฑ ๋ฌธ์ œ"์—์„œ "์ˆœํ™˜ ์ข…์†์„ฑ"์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์ด ํ›จ์”ฌ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

@kumavis ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ํ—ˆ๋ฝํ•  ๋•Œ ์ž‘์—…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ๋•Œ ์ƒํ˜ธ ์˜์กด์„ฑ ์ •๋ฆฌ์˜ ํ˜„์žฌ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
(ํ™”์‚ดํ‘œ๋Š” ์ ์ ˆํ•œ ๊ฒฝ์šฐ ์ œ๊ฑฐ ํ•ด์•ผ ํ•˜๋Š” ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋ƒ„)

  • [x] ์žฌ๋ฃŒ
  • [x] ๊ธฐํ•˜ํ•™
  • [x] Object3D
  • [x] ์ˆ˜ํ•™
  • [x] ๋ชจ์–‘

    • [x] ๋ชจ์–‘ -> FontUtils

    • [x] ๋ชจ์–‘ -> ExtrudeGeometry

    • [x] ๋ชจ์–‘ -> ๋ชจ์–‘ ๊ธฐํ•˜

    • [x] ๊ฒฝ๋กœ -> ๋ชจ์–‘

  • [ ] ์ƒ์ž3

    • [ ] Box3 -> BufferGeometry

    • [ ] Box3 -> ๊ธฐํ•˜ํ•™

๋ชจ์–‘:

image

์ƒ์ž3:

image

์ˆ˜ํ•™:

์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋“ค์€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€๋งŒ ์ด๋ฅผ ํ†ตํ•ด ์ถฉ๋ถ„ํ•œ ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
image

Shape๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ExtrudeGeometry ๋ฐ ShapeGeometry ์— ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// Convenience method to return ExtrudeGeometry

THREE.Shape.prototype.extrude = function ( options ) {

  var extruded = new THREE.ExtrudeGeometry( this, options );
  return extruded;

};

// Convenience method to return ShapeGeometry

THREE.Shape.prototype.makeGeometry = function ( options ) {

  var geometry = new THREE.ShapeGeometry( this, options );
  return geometry;

};

์ด์ œ Shape ๋Š” Path ์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๊ณ  ExtrudeGeometry ๋ฐ ShapeGeometry ๋Š” ๋ชจ๋‘ Geometry ์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ƒ์ ์ธ ๊ฒฝ์šฐ์— ์–ด๋–ค ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ Vector3 <-> Matrix4 ์™€ ๊ฐ™์€ ๋ฒ”์ฃผ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ํŽธ์˜๋ฅผ ์œ„ํ•ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ๊ณผ ์‹ธ์šธ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์™„๋ฃŒ๋กœ ํ‘œ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

Shape -> FontUtils ๋Š” triangulate ์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ Utils๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ํฐ ์Šน๋ฆฌ๋Š” ์•„๋‹ˆ๋‹ค. ์™„๋ฃŒ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Box3 -> BufferGeometry ๋ฐ Box3 -> Geometry ๋‘˜ ๋‹ค ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์ž์ฒด์— ํด๋ž˜์Šค ์ข…์† ๋™์ž‘์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ :

setFromObject: function () {

  // Computes the world-axis-aligned bounding box of an object (including its children),
  // accounting for both the object's, and childrens', world transforms

  /* ... */

  if ( geometry instanceof THREE.Geometry ) {
    /* ... */
  } else if ( geometry instanceof THREE.BufferGeometry && geometry.attributes[ 'position' ] !== undefined ) {
    /* ... */
  }

  /* ... */

}

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์˜ worldCoordinate ์ •์ /์œ„์น˜๋ฅผ ๋ฐ˜๋ณตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ๋œ ๊ฐ’์„ ์กฐํšŒํ•˜๋Š” BufferGeometry ์— ๊ฒŒ์œผ๋ฅธ vertices ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์˜ํ–ฅ์— ๋Œ€ํ•ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” Geometry.computeBoundingBox ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Geometry
BufferGeometry

Box3๋Š” browserify ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. coballast/threejs-browserify-conversion-utility#21์˜ ์ฐธ๊ณ  ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@kumavis Box3/Geometry/BufferGeometry๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒ์žฅ ์†”๋ฃจ์…˜์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋น ๋ฅด๋ฉด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋ณผ ์ˆ˜ ์—†์ง€๋งŒ ์—ฌ๊ธฐ ์—์„œ if/else ๋Œ€์‹  Geometry ๋ฐ BufferGeometry ์— ๊ตฌํ˜„๋œ ๋Œ€๋กœ geo.computeBoundingBox ๋ฅผ ์‚ฌ์šฉ ํ•˜๋ผ๋Š” ์œ„์˜ ์ œ์•ˆ ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. . ๋Œ€์‹  box3.setFromObj ๋Š” geometry.computeBoundingBox ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์ƒ์„ฑ๋œ box3๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ˆœํ™˜ dep์˜ Box3 -> BufferGeometry ๋ฐ Box3 -> Geometry ๋์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋น ์ง„ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

ํ  ์•„๋งˆ๋„ ๊ฒฐ๊ณผ ์ฝ”๋“œ๊ฐ€ ์•ฝ๊ฐ„ ๋ณต์žกํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Box3.setFromObject ๋Š” ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜์ง€๋งŒ ์˜ต์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค. Geo's๋Š” box3s๋ฅผ ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ, Box3.setFromObject ๋Š” ๊ฒฝ๊ณ„ ์ƒ์ž/๋ฒ”์œ„์— ๋Œ€ํ•ด ์ง€์—ญ์— ์š”์ฒญํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ฒฝ๊ณ„ ์ƒ์ž/๋ฒ”์œ„์— ๋Œ€ํ•ด์„œ๋Š” Object3D / Mesh ๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ์•„์š”.

๊ด€๋ จ ๊ฐ€๋Šฅ์„ฑ: #6546

์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์—†์œผ๋ฉด ๋กœ๋” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋Ÿฌํ•œ ๋™์  ์ข…์†์„ฑ์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

3๊ฐœ์˜ commonjs ๋ณ€ํ™˜๊ธฐ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ npm์— ์ „์ฒด commonjs ๋ฒ„์ „์„ three.cjs๋กœ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋งˆ์Šคํ„ฐ์—์„œ #6546์„ ์ˆ˜๋™์œผ๋กœ ์ฒด๋ฆฌํ”ฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์  ์ข…์†์„ฑ์€ node.js์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์ •์  ์ข…์†์„ฑ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Browserify(๋˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  cjs์—์„œ ๋ธŒ๋ผ์šฐ์ € ๋„๊ตฌ๋กœ)์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €ํ™” ์ฆ๋ช… : http://requirebin.com/?gist=b7fe528d8059a7403960

@kamicane ์ฐธ๊ณ  - Raycaster (์ด์ „์—๋Š” Ray )์— ์ต๋ช… ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ THREE ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด์ œ Raycaster ๊ฐ€ ๋” ๊ฐ€๋ณ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mrdoob , @Mugen87 ์šฐ๋ฆฌ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•œ Three.js ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์—ฌ์ „ํžˆ ๋‹ค์Œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

(!) Circular dependency: node_modules/three/src/math/Vector3.js -> node_modules/three/src/math/Matrix4.js -> node_modules/three/src/math/Vector3.js
(!) Circular dependency: node_modules/three/src/math/Vector3.js -> node_modules/three/src/math/Quaternion.js -> node_modules/three/src/math/Vector3.js
(!) Circular dependency: node_modules/three/src/math/Sphere.js -> node_modules/three/src/math/Box3.js -> node_modules/three/src/math/Sphere.js
(!) Circular dependency: node_modules/three/src/objects/LineSegments.js -> node_modules/three/src/objects/Line.js -> node_modules/three/src/objects/LineSegments.js

Three.js์— ์—ฌ์ „ํžˆ ์ˆœํ™˜ ์ข…์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

Vector3์™€ Matrix4๋Š” ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด ํ•˜๋‚˜๋ฅผ ๋‹น๊ธฐ๋ฉด ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ๋‹น๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆœํ™˜ ์ข…์†์„ฑ์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@bhouston ๋„ค ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํžŒํŠธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์ˆœํ™˜ ์ข…์†์„ฑ์€ ํ—ˆ์šฉ๋˜๊ณ  ๋กค์—…์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Vector3 ๋Š” multiplyMatrices ๋ฐ getInverse Matrix4 $์—๋งŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ (https://github.com/mrdoob/three.js/๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๋ธ”๋กญ/dev/src/math/Vector3.js#L315)

@roomle-build Idk, Man, Matrix4 ์ƒ์„ฑ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—? ~๋Š” ์–ด๋•Œ

    applyMatrix4: function ( m ) {

        var x = this.x, y = this.y, z = this.z;
        var e = m.elements;

        var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );

        this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;
        this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;
        this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;

        return this;

},

?

{ elements: [....] }๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž‘๋™ํ•˜๊ฒ ์ง€๋งŒ ๊ฑฐ๊ธฐ์— Matrix4๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์šฐ๋ฆฌ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Vector3 ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Vector3 ๋Š” project ๋ฐ unproject Matrix4 ์— ์ข…์†๋ฉ๋‹ˆ๋‹ค.

    project: function () {

        var matrix = new Matrix4();

        return function project( camera ) {

            matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );
            return this.applyMatrix4( matrix );

        };

    }(),

    unproject: function () {

        var matrix = new Matrix4();

        return function unproject( camera ) {

            matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );
            return this.applyMatrix4( matrix );

        };

    }(),

Vector3 ๋Š” applyEuler ๋ฐ applyAxisAngle Quaternion ์— ์ข…์†๋ฉ๋‹ˆ๋‹ค.

    applyEuler: function () {

        var quaternion = new Quaternion();

        return function applyEuler( euler ) {

            if ( ! ( euler && euler.isEuler ) ) {

                console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );

            }

            return this.applyQuaternion( quaternion.setFromEuler( euler ) );

        };

    }(),

    applyAxisAngle: function () {

        var quaternion = new Quaternion();

        return function applyAxisAngle( axis, angle ) {

            return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );

        };

    }(),

์ œ์•ˆ?

๋ฐ˜๋“œ์‹œ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ multiplyMatrices ๋ฅผ Math ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ช…์€ ๋ฌผ๋ก  multiplyMatrices( a: Matrix4, b: Matrix4, result: Matrix4 ): Matrix4 ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. Vector3 ๋‚ด๋ถ€์—์„œ $# import { multiplyMatrices } from './Math'; Matrix4 #$์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( Matrix4 ์˜ API ํ‘œ๋ฉด์„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด).

๋ฐฉ๊ธˆ ๊ฐ„๋žตํžˆ ์‚ดํŽด๋ณด์•˜๊ณ ( Quaternian ์‚ฌ๋ก€๋Š” ๋ณด์ง€ ์•Š๊ณ  Vec3/Mat4 ) ๋‚˜๋จธ์ง€ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์˜ํ–ฅ ๋ฐ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @mrdoob ์ด ์ œ์•ˆ์„ ์š”์ฒญํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์ƒ๊ฐ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@roomle-build ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์œ„ํ•ด ๋” ๋งŽ์€ ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๊ฐ๊ฐ์˜ ๋ชจ๋“  ์ˆ˜ํ•™ ๋ฐฉ๋ฒ•์ด ์ž์ฒด ๋ชจ๋“ˆ์ธ ๊ฒฝ์šฐ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ๊ฐ€์ ธ์˜ค์ง€๋งŒ ์ด๋Š” ๋งŽ์€ ๋ชจ๋“ˆ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@makc ์ •๋ง ์•„๋‹™๋‹ˆ๋‹ค. ์ž‘์€ "๋„์šฐ๋ฏธ" ๊ธฐ๋Šฅ์ด ๋งŽ์€ ํ•˜๋‚˜์˜ ํฐ ๋ชจ๋“ˆ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ ๋“ฑ์—๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ•™ ๋ชจ๋“ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

export const multiplyMatrices( a, b, result ) {ย // ... DO STUFF ... // }
export const getInverse( /* ... */ ) {ย // ... DO STUFF ... // }
// ...
// ...

์†Œ๋น„ ๋ชจ๋“ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

import { Matrix4 } from './Matrix4.js';
import { multiplyMatrices } from './math';
const result = new Matrix4( );
multiplyMatrices( a, b, result );

๋ชจ๋“  ๊ฒƒ์„ ํ•จ๊ป˜ ๋ฌถ์„ ๋•Œ ๋กค์—…์€ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฌถ์Œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งŽ์€ ์ธ๊ธฐ ์žˆ๋Š” ๋„์„œ๊ด€์ด ํ•˜๊ณ  ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ RxJS๋Š” import "๋…ผ๋ฆฌ"๋„ ๋‚ด๊ฐ€ ์„ค๋ช…ํ•œ ํŒจํ„ด์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

 import { flatMap, map, tap } from 'rxjs/operators';

myObject.run().pipe(
  tap(result => doSomething()), 
  flatMap(() => doSomethingElse()), 
  map(() => doAnotherThing())
);

https://auth0.com/blog/whats-new-in-rxjs-6/ ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ RxJS 6์—์„œ ์ด ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•œ "์ด์œ ์™€ ๋ฐฉ๋ฒ•"์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋‹จ์ง€ ์ƒ๊ฐ์ผ ๋ฟ์ด๋ฉฐ ์ด๊ฒƒ์ด ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋ฏธ์น  ์˜ํ–ฅ์— ๋Œ€ํ•ด ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ math ๋ชจ๋“ˆ์€ ์ด์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  "์ค€๋น„"๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ˆ˜ํ•™ ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” "์ •์  ์ข…๋ฅ˜"์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋กค์—…์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค...

@roomle-build ํ  ๊ทธ๋ž˜์„œ ๋กค์—…์ด ๋™์ผํ•œ ๋ฒ”์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

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

์ด ๋ณ€๊ฒฝ์— ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ์ด ๋ชจ๋“  ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„ ์‹œ์ ์—์„œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@makc ์ •๋ง ์•„๋‹™๋‹ˆ๋‹ค. ์ž‘์€ "๋„์šฐ๋ฏธ" ๊ธฐ๋Šฅ์ด ๋งŽ์€ ํ•˜๋‚˜์˜ ํฐ ๋ชจ๋“ˆ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ ๋“ฑ์—๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ•™ ๋ชจ๋“ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ œ์•ˆ๋œ ๊ฒƒ์ด๋ผ๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค๋ช…๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Three.JS์˜ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋””์ž์ธ์—์„œ ๊ธฐ๋Šฅ์ ์ธ ๋””์ž์ธ์œผ๋กœ์˜ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

@roomle-build ํ  ๊ทธ๋ž˜์„œ ๋กค์—…์ด ๋™์ผํ•œ ๋ฒ”์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

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

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

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

์–ด๋–ค ๋ฌธ์ œ์—์„œ ๋””์ž์ธ ๊ฒฐ์ •์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ๊ฑฐ ์ž˜์–ด์šธ๋ฆด๊ณณ ์—†๋‚˜์š”?

BTW gl-matrix๋Š” ๊ธฐ๋Šฅ์  ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค: https://github.com/toji/gl-matrix/tree/master/src/gl-matrix

@๋ฃธ๋นŒ๋“œ

ํ˜„์žฌ ์ˆ˜ํ•™ ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” "์ •์  ์ข…๋ฅ˜"์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋•Œ์š”?

@mrdoob ๋‚˜๋Š” gl-matrix์˜ ๊ธฐ๋Šฅ์  ๋””์ž์ธ์œผ๋กœ vec3์˜ ๊ฐ ๊ธฐ๋Šฅ(์ด์ „ ์˜๊ฒฌ์—์„œ ๋งํฌํ•œ vec3 ํŒŒ์ผ์—์„œ)์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๋‚ด๋ณด๋‚ด์ง„๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ฌ ํ•จ์ˆ˜๋ฅผ ์„ ํƒํ•˜๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. vec3๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ Three.JS์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ์ „์ฒด ํด๋ž˜์Šค์ธ ๋ฐ˜๋ฉด ๊ธฐ๋Šฅ์  ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” ๊ฐœ๋ณ„ ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

(gl-matrix ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋˜ ๋‹ค๋ฅธ ๋ฉ‹์ง„ ์ ์€ ๋ชจ๋“  ๊ฐœ๋ณ„ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @toji ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ˆ˜ํ•™์˜ ์ตœ์ ํ™”๋œ ๋ฒ„์ „์„ ๊ฐ ๊ฐœ๋ณ„ ์ž‘์—…์— ์ธ๋ผ์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์†๋„ ๋ฉด์—์„œ ์ƒ๋‹นํžˆ ํšจ์œจ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ three.js์˜ ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ /math์˜ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” Three.JS์˜ ์ด ๋ถ€๋ถ„์„ ๋ฆฌํŒฉํ† ๋งํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ์ž‘์œผ๋ฉฐ ์š”์ฆ˜ ๋‚ด ํ”„๋กœํŒŒ์ผ๋ง ํ…Œ์ŠคํŠธ์— ์‹ค์ œ๋กœ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ตœ๋Œ€๋กœ ํšจ์œจ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์œ ์ง€ ๊ฐ€๋Šฅํ•œ ๊ฐ€๋…์„ฑ๊ณผ ์‚ฌ์šฉ ์šฉ์ด์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ถฉ๋ถ„ํžˆ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

@bhouston ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ˜Š

๋‚˜๋Š” ๋‹จ์ง€ ๊ทธ ์ฃผ์ œ์— ๋Œ€ํ•ด ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ  ์‹ถ์—ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ importing function vs importing classes ์—์„œ cyclic dependencies ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ฃผ์ œ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. (๋˜ํ•œ import { someFunction } from 'SomeModule' ์ด import SomeClass from 'SomeModule' ๋ณด๋‹ค ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋œ ์‰ฌ์šด ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ํ™•์‹คํžˆ ์ด ๋ฌธ์ œ/๋Œ€ํ™”์˜ ์ฃผ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ˆœํ™˜ ์ข…์†์„ฑ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ธฐ๋Šฅ์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค์— ๋„ฃ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. multiplyMatrices multiplyMatrices ๊ฐ€ ์žˆ๋Š” Multiplier-Class๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „์— ๋งํ–ˆ๋“ฏ์ด ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ญ์ œํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ƒ

#19137 ํ•ด๊ฒฐ ํ›„ ์ง€๊ธˆ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๐ŸŽ‰ .

@Mugen87 ์™€, 5๋…„์ฐจ! ๋“œ๋””์–ด ์„ฑ๊ณต์„ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค :fire: :clap:
๊ทธ ๋‹น์‹œ์—๋Š” ๊ทธ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค :smile_cat:

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