์๋ ๋ชจ๋๋ค.
@kumavis ์ ์ ๋ THREE.js๋ฅผ browserify ์ํคํ ์ฒ๋ก ์ฎ๊ธฐ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ํ์ผ์ browserify ๋น๋ ์์คํ ์ผ๋ก ์ฎ๊ธฐ๊ณ ๊ฟ๊บฝ ๊ฟ๊บฝ ๋ง์๋ฉฐ three.min.js๋ฅผ ์์ฑํ ์ ์๋ ์์ ๊น์ง ์ข์ ์ง์ ์ ์ด๋ฃจ์์ต๋๋ค.
๋ถํํ๋ ์์ ๋ ์๋ํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด commonjs์ ๋ฌ๋ฆฌ browserify๋ ์ํ ์ข ์์ฑ์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฌ๊ธฐ ์์ ์ข ์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ํํ ๊ทธ๋ํ๋ฅผ ๋ง๋ค์์ต๋๋ค.
์ด๊ฒ๋ค์ด ์ํค์ง ์๋ ํ, ์ฐ๋ฆฌ๋ THREE.js๋ฅผ browserify ๋น๋๋ก ์ฎ๊ธธ ์ ์์ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ browserify์ ๊ฒฐํ์ด๋ผ๊ณ ์๊ฐํ์ง ์๊ณ ์คํ๋ ค THREE.js์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ํ ์ข ์์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ์ํํธ์จ์ด์์ ๋์ ๊ฒ์ด๋ฉฐ ๋ชจ๋ ์ข ๋ฅ์ ๋ฌธ์ ๋ก ์ด์ด์ง๋๋ค.
ํ์ด์ผ ํ ๋งค๋ญ์ด๋ค.
http://jsbin.com/medezu/2/edit?html,js ,์ถ๋ ฅ
@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๊ฐ ์์ต๋๋ค.
๋ณด๊ธฐ๊ฐ ์กฐ๊ธ ์ด๋ ต์ง๋ง Geometry
s๋ ๊ธฐ๋ณธ ํด๋์ค์์ ์ข์ ๋จ๋ฐฉํฅ dep๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Light
s ์ Camera
s ๋ ๋น์ทํ ์ํฉ์ ๊ฐ์ง๊ณ ์์ต๋๋ค -- ๊ทธ๋ค์ ๊ธฐ๋ณธ ํด๋์ค์ ๊ดํด์๋ ์ข์ง๋ง Object3D
์ ์์กด์ฑ์ _๊ทธ๋ค์ ๋ํ_ ๋ถํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
Curve
s Path
s Line
s ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง Shape
๋ ์ฝ๊ฐ ์์ผ ์์ต๋๋ค.
@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 ์ํ ์ข ์์ฑ ๋ฌธ์ ๋ ๊ฒช์์ต๋๋ค. ์ํ ์ฐธ์กฐ ํ์ผ ๋ด๋ถ์ ํน์ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๋ ค๊ณ ํ ๋ ์ฃผ๋ก ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
Material
๋ฐ Object3D
์ ๋ํ ๋ง์ ์ํ dep๋ฅผ ์ ๋ฆฌํด์ผ ํฉ๋๋ค.Mesh
๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ผ๋ถ ๊ด๋ จ ์๋ dep๊ฐ ์์ ์ ์์ง๋ง ๋๋ฌด ๋ฏธ์น ๊ฒ์ ์๋๋๋ค.
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 ๊ตฌ์กฐ๋ก ๋ ์์ ๋ชจ๋๋ก ๋๋๋ ๊ฒ์ ์ ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
var Alert = require('react-bootstrap/lib/Alert');
์ ๊ฐ์ ์์
์ ์ํํ ์ ์์ต๋๋ค.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์ ๊ณต์์ ์ผ๋ก ๋ชจ๋์ ๋์ ํ๋ค๋ ์ ์ ์ ์ํ์ญ์์ค.
@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/
๋ค์์ ์คํฌ๋ฆฐ์ท์ ๋๋ค.
์๋ง์ Object3D circ dep๊ฐ ์ ๊ฑฐ๋์์์ ๋ณด๊ณ ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ์ํ์ด @kumavis!
์์ฐ ๊ฐ์ ์ฝ๋๋ฒ ์ด์ค์ธ๊ฐ์? ๋ฏธ์น
์ ํธ๋ฆฌํฐ์ ๊ทธ๋ํ ์์ฑ ๋ถ๋ถ์ ๋ง๋๋ ์์ ์ ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ํ๋ง ๋ณด์๋ Shape
์ Geometry
๋ ํ ์ ์๋ ๊ฐ๋ฅํ ํด๋์ค ํธ๋ฆฌ๋ก ๋ณด์
๋๋ค.
@coballast ๋น์ ์ด ์ด๊ฒ์ ๊ฐ๋นํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น?
Vector3 Matrix4์ ์คํฌ๋์น ๋ณ์๋ฅผ ์ ์ ์๊ฐ์ด ์๋๋ผ ์ฒ์ ์ฌ์ฉํ ๋ ๋๋ฆฌ๊ฒ ์ ์
์๋ ๋ณ๊ฒฝ์ด ์๋ ์
์คํธ๋ฆผ dev
์ ๋ํ PR์
๋๋ค.
๋ํ ๋ฌธ์ ์ ๋ชฉ์ "์ฌ๊ฐํ ์ํ ์ข ์์ฑ ๋ฌธ์ "์์ "์ํ ์ข ์์ฑ"์ผ๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ํฉ์ด ํจ์ฌ ๊ฐ์ ๋์์ต๋๋ค!
@kumavis ๋ฌผ๋ก ์ ๋๋ค. ์๊ฐ์ด ํ๋ฝํ ๋ ์์ ํ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ๋ณผ ๋ ์ํธ ์์กด์ฑ ์ ๋ฆฌ์ ํ์ฌ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(ํ์ดํ๋ ์ ์ ํ ๊ฒฝ์ฐ ์ ๊ฑฐ ํด์ผ ํ๋ ์ฐ๊ฒฐ์ ๋ํ๋)
์ด๋ฌํ ๋
ธ๋๋ค์ ์๋ก ์ฐ๊ฒฐ๋์ด ์์ง๋ง ์ด๋ฅผ ํตํด ์ถฉ๋ถํ ํธ์์ฑ์ ์ ๊ณตํฉ๋๋ค.
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:
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@Mugen87 ์, 5๋ ์ฐจ! ๋๋์ด ์ฑ๊ณต์ ์ถํํฉ๋๋ค :fire: :clap:
๊ทธ ๋น์์๋ ๊ทธ ๊ทธ๋ํ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋งค์ฐ ์ฆ๊ฑฐ์ ์ต๋๋ค :smile_cat: