ããã«ã¡ã¯ãã¿ãªããã
@kumavisãšç§ã¯ãTHREE.jsãbrowserifyã¢ãŒããã¯ãã£ã«ç§»è¡ããå¹ççãªæ¹æ³ãèŠã€ããããã«äžçæžåœåãçµãã§ããŸããã ãã¹ãŠã®ãã¡ã€ã«ãbrowserifyãã«ãã·ã¹ãã ã«ç§»åããgulpã䜿çšããŠthree.min.jsãçæã§ããããã«ãªããŸã§ãé 調ã«é²æ©ããŸããã
æ®å¿µãªãããcommonjsãšã¯ç°ãªããbrowserifyã¯åŸªç°äŸåé¢ä¿ãåŠçã§ããªããããäŸã¯æ©èœããŸãããããã¯ãTHREE.jsã«å€æ°ãããŸãã
ããã§ãäŸåé¢ä¿ãè¡šãã€ã³ã¿ã©ã¯ãã£ããªã°ã©ããäœæããŸããã
ãããã解ãããŸã§ãTHREE.jsãbrowserifyãã«ãã«ç§»è¡ããããšã¯ã§ããŸããã
ç§ã¯ãããbrowserifyã®æ¬ é¥ã§ã¯ãªããTHREE.jsã®åé¡ã ãšèããŠããŸãã 埪ç°äŸåã¯ãäžè¬çã«ãœãããŠã§ã¢ã«ããã®ã¯æªãããšã§ãããããããçš®é¡ã®åé¡ãåŒãèµ·ãããŸãã
ããã¯è§£ãããã®ããªãã®çµã³ç®ã§ã
http://jsbin.com/medezu/2/edit?htmlãjsãoutput
@coballastã¯ãäŸåé¢ä¿jsonãçæããããã«äœ¿çšããã³ãŒããæçš¿ã§ããŸããïŒ
ããªã³ã³ãã€ã«ãããthree.min.jsãã¡ã€ã«ãçŽæ¥äœ¿çšããã ãã§ãã Browserfyå ã§Three.jsãåã ã®ãã¡ã€ã«ã«åå²ããå¿ èŠã¯ãããŸãããå®éã®å©çã®ããã«ã人çãããå°é£ã«ããŠããã ãã§ãã
ç§ã¯çµéšãã話ããŸããç§ãã¡ã¯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
ã¯ãŸã ååšããŠããŸããã çŸåšãã¹ã¯ã©ããå€æ°ã®å®éã®ã€ã³ã¹ã¿ã³ã¹åæéã¯ããã»ã©éèŠã§ã¯ãããŸããã ããã§ã®æ¬åœã®ãã€ã³ãã¯ãçŸåšã®å®è£
ã¯ããã«ãã·ã¹ãã ããã¡ã€ã«ãé£çµããé åºã«äŸåããŠãããšããããšã§ãã ããã¯éåžžã«é ãçµåã§ããããã«ãã·ã¹ãã ãå€æŽããããé£çµé åºãå€æŽããããã«ãã¡ã€ã«ã®ååãå€æŽããããããšãæ確ãªæ¥ç¶ããªããç¡å¹ãªãã«ããçºçããå¯èœæ§ããããŸãã
ããã¯ããã®çµã³ç®ããã°ã«çŸããæ¹æ³ã®1ã€ã«ãããŸããã ãã ãããã®ç¹å®ã®åé¡ã«å¯ŸåŠããããšã¯ã§ããŸãããAPIã«å€ãã®é倧ãªå€æŽãå ããå¿ èŠã®ãªãäžè¬çãªãœãªã¥ãŒã·ã§ã³ã¯ãããŸããã
ããŒã... ILMã®C ++æ°åŠã©ã€ãã©ãªãèŠãŠã¿ãŸãããããã¯ãæ°åŠã©ã€ãã©ãªã®ãŽãŒã«ãã¹ã¿ã³ããŒãã ãšæããŸãã é©ããããšã«ããããã¯åŸªç°çã§ã¯ãããŸããã ãããã¯åºæ¬çã«ãããããå®çŸ©ããåçŽãªã¿ã€ãããè€éãªã¿ã€ãã®æ確ã«å®çŸ©ãããé åºãæã£ãŠããããããéåžžã«æ³šææ·±ãè¡ããšãããŸããããšæããŸãã
https://github.com/openexr/openexr/tree/master/IlmBase/Imath
æ°åŠããããŠããã¯ãæãåçŽãªããã§ãã
äŸåé¢ä¿ã°ã©ãã®è©³çŽ°ïŒ
Material
ã«ã¯ãåºæ¬ã¯ã©ã¹ãšã®åæ¹åã®depsããããŸã
å°ãèŠã¥ããã§ããã Geometry
ã¯ãåºæ¬ã¯ã©ã¹ã§äžæ¹åã®æ·±ããè¯ãããã§ãã
Light
ãšCamera
ã¯åæ§ã®ç¶æ³ã«ãããŸããåºæ¬ã¯ã©ã¹ã«é¢ããŠã¯è¯å¥œã§ããã Object3D
ã®äŸåé¢ä¿ã¯äžèŠã®ããã§ãã
Curve
s Path
s Line
ã¯è¯ãããã§ããã Shape
ã¯å°ã絡ã¿åã£ãŠããŸãã
@coballastããããšãïŒ ããã¯çŽ æŽãããæŽå¯ã§ãã
ã³ã¡ã³ãã®ããã«èªåèªèº«ãè¿œå ããŸã:)
ãšããã§ãããšãã°ã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
ã®å€ãã®åŸªç°æ·±åºŠãã¯ãªã¢ããå¿
èŠããããŸããMesh
ã¯æ¬¡ã®ããã«ãªããŸãã ãã¶ããããã€ãã®ç¡é¢ä¿ãªãããã§ãããããŸãã¯ã¬ã€ãžãŒã§ã¯ãããŸããã
Object3D
ãšGeometry
ã®å圢ã Object3D -> Mesh
åç
§ã¯ãäžèšã®PRã§æ±ãããŠããŸãã Mesh -> Geometry
åç
§ã¯åé¡ãããŸãããb / c Mesh
ã¯Geometry
ã®ã€ã³ã¹ã¿ã³ã¹ãå¶åŸ¡ããŸãã ããã§ããã¯ã©ã¹åºæã®åäœïŒ Geometry
/ BufferGeometry
ïŒã®åãã§ãã¯ãå®è¡ããããšã§äžæãããå¯èœæ§ããããŸãã
Geometry -> Mesh
åç
§ã«ã€ããŠã¯ã geometry.mergeMesh( mesh )
ãæäŸããããšã§ãã Geometry
ã¯Mesh
ãããäœã¬ãã«ã®æŠå¿µãªã®ã§ã mesh.mergeIntoGeometry( geo )
ãšããŠå転ãã$ïŒ mergeMesh
$ãå»æ¢ããŸãã
誰ãããããã®ããã€ããä¿®æ£ããPRãããŒãžããå Žåã¯ãç§ã«ç¥ãããŠãã ãããçŸåšã®ç¶æ³ãåæ ããããã«ã°ã©ããæŽæ°ããŸãã
@bhouston @ gero3æ°åŠã©ã€ãã©ãªã§åãã¬ãã«ã®ãŠãŒã¶ããªãã£/ãŠãŒãã£ãªãã£ãååŸããã«ã¯ã埪ç°äŸåé¢ä¿ãå¿ èŠã§ãããšã¯ç¢ºä¿¡ããŠããŸããã ç§ã¯ééã£ãŠããå¯èœæ§ããããŸãããVector3ãã·ã¹ãã ã®æ®ãã®éšåããå®å šã«åé¢/ç¡ç¥ã«ä¿ã¡ããã®ãããã¿ã€ããå€æŽããŠMatrix4ã¢ãžã¥ãŒã«ã®Matrix4ã«å¯Ÿå¿ããããšã¯ã§ããŸãããïŒ è¡åã¯ãã¯ãã«ãããè€éãªã®ã§ãããã¯æŠå¿µçã«ã¯çã«ããªã£ãŠããŸãã äºæ ãé²ãããã«ããããã¿ã€ããšã¯ã©ã¹ãæ§ç¯ããé åºãæ確ã«ããæ¹ããããšæããŸãã
@bhouston @ gero3APIããŸã£ããå€æŽããã«ãããå®è¡ã§ããå¯èœæ§ããããšæããŸãã ãã£ããèŠãŠãäœãäœãªã®ãèŠãŠã¿ãŸãããã
æ°åŠã«é¢ããŠã¯ããã¹ãŠã®ãã¹ã¯ã©ããããããã1ãæã«é 眮ããã ãã§ãããšæããŸãã ããããVector3ãšMatrix4ã®äž¡æ¹ãæããªã3jsã®åäžã®äœ¿çšå¯èœãªã°ã©ãã¯ãªãã§ãããã
æ°åŠã©ã€ãã©ãªã®ããã©ãŒãã³ã¹ãAPIãå€æŽããªããœãªã¥ãŒã·ã§ã³ãããã°ãç§ã¯ããã§ãã¹ãŠã§ãã
@coballastã¯ãAPIã®å€æŽãªãã§åŸªç°äŸåãåé€ã§ããŸãããb/ cã¯ã©ã¡ãããä»ã®ã¿ã€ãã䜿çšããã¡ãœãããæäŸããŸãã Vector3
Matrix4
browserify compatã«é¢ããŠã¯ãå¯äžã®èŠä»¶ã¯ãã¹ã¯ã©ããå€æ°ã®ã€ã³ã¹ã¿ã³ã¹åãã¯ã©ã¹å®çŸ©æéå€ã«ç§»åããããšã§ãïŒæåã®å®è¡ã§ã€ã³ã¹ã¿ã³ã¹åããããã«ããŸãïŒã ãã®ããã«ãããæ æ°ã«ããŸãã ããã¯APIãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŸããã
ãã®ãããªå€åã¯å€§äžå€«ã ãšæããŸãã
@kumavisããïŒ ã¯ãã ãªãŒã±ãŒãããããŸããã ããã¯ç°¡åã§ãã
次ã®çç±ã«ããã3ã€ãrequireæ§é ãæã€å°ããªã¢ãžã¥ãŒã«ã«åå²ãããããšãå®å šã«ãµããŒãããŸãã
var Alert = require('react-bootstrap/lib/Alert');
ã®ãããªããšãã§ããŸããOrbitControls.js
ã®ããã«ã3ã€ã®ã°ããŒãã«ãªããžã§ã¯ãèªäœãå€æŽããŠTHREE.OrbitControls
ã«çœ®ãããã©ã°ã€ã³ããããã€ããããŸãã ããã¯ããã«ãããã»ã¹ã§ã°ããŒãã«åå空éã«3ã€ååšããå¿
èŠããããããææ°ã®javascriptãã¬ãŒã ã¯ãŒã¯ã§ã¯ã¢ã³ããã¿ãŒã³ã§ããããã¯ããããå¿
èŠãšãããã¡ã€ã«ã§ã¯ãªãã3ã€ååšããå¿
èŠãããããã§ãã THREEã¯ãããå
éšçã«ãå®è¡ããåžžã«THREEåå空éãå€æŽããŸããããã¯ãç¹å®ã®THREEã¢ãžã¥ãŒã«ãå«ããã®ã«çæ³çã§ã¯ãããŸãããTHREE.OrbitControlsã«èº«ã眮ã
ãããã3jsã®ãã¹ãŠã®ã³ãŒãã¯ãããè¡ããŸããïŒ
@DelvarWorldã¯æžããïŒ
次ã®çç±ã«ããã3ã€ãrequireæ§é ãæã€å°ããªã¢ãžã¥ãŒã«ã«åå²ãããããšãå®å šã«ãµããŒãããŸãã
以åã¯åå²ããã®ããããšæã£ãŠããŸããããä»ã®ãšããThreeJSã«ã¯ã·ã³ãã«ãããããŸãã 3DãåããŠäœ¿çšãã人ã«ãšã£ãŠã¯ãçŸåšã®åœ¢ã§ãéçºããŒã ã®åªå äºé ã§ãããšãã圢ã§ããã䜿ãããããªã£ãŠããŸãã ã¢ãžã¥ãŒã«ã·ã¹ãã ãå¿ èŠãšããã«ThreeJSã䜿çšã§ããŸãïŒã¢ãžã¥ãŒã«ã·ã¹ãã ã¯ããããããããã¹ãŠãå®å šã«äºææ§ãããããã§ã¯ãããŸããïŒã
@makcã®ããã«ãç§ã@DelvarWorldãTHREEåå空éã«ç©ãå ¥ããªããšããææ¡ã«æžæã£ãŠããŸãã
代ããã«ã©ãã«/ã©ã®ããã«ãªããŸããïŒ
ç§ã«ã¯ã1ã€ã®ã°ããŒãã«ãªããžã§ã¯ãTHREEã®ã¿ãäœæããã®ãè¯ããã¿ãŒã³ã®ããã«æããŸãããã®ãªããžã§ã¯ãã«ã¯ããã®ãã¹ãŠã®éšåïŒããã³å Žåã«ãã£ãŠã¯äžéšã®æ¡åŒµæ©èœ/ãã©ã°ã€ã³ïŒãå«ãŸããŠããŸãã
ç§ã¯@DelvarWorldã«åæããŸããã°ããŒãã«ã«é 眮ããææ³ã¯ãã³ãŒãããŒã¹ã®å¥å šæ§ã«é©ããŠããªããšããããšã§ããã°ããŒãã«èªäœã«é 眮ãããšããäžçš®ã®åŸ®åŠãªè°è«ã¯åé¡ã§ã¯ãããŸãããé ãããäŸåé¢ä¿ã°ã©ããããã³ã°ããŒãã«ãå©çšå¯èœã«ããããšããçããä»ã®ãã©ã¯ãã£ã¹ã
ãããããã®è°è«ã¯äž»ã«å éšéçºãšã³ãŒãæ§é ã«éå®ãããŠããŸãã ã©ã€ãã©ãªãéçã³ãŒããã³ãã«ãšããŠæäŸããããšã«é¢ããŠã¯ããã¹ãŠã®ã¯ã©ã¹ãã°ããŒãã«THREEã«é 眮ããããšã¯ç§ã«ãšã£ãŠçã«ããªã£ãŠããŸãã
åè«ã¯ãTHREE.jsã·ãŒã³jsonãéã·ãªã¢ã«åããå Žåããšã³ããªã¯ã¯ã©ã¹ãæååãšããŠãªã¹ãããã ãã§ã THREE[ obj.type ]
ã®ããã«ã°ããŒãã«ããåŒãåºãããšãã§ãããšãããã®ã§ãã ããã¯ãéã·ãªã¢ã«åããåã«THREE
ã§å®çŸ©ããŠããéããæšæºã®three.jslibã«ãªãã¯ã©ã¹ã§æ©èœããŸãã THREE
ã°ããŒãã«ãªãã§ãã®åäœã眮ãæããæåã®æ¹æ³ãããããŸããã
ããã¯ãéã·ãªã¢ã«åããåã«THREEã§å®çŸ©ããŠããéããæšæºã®three.jslibã«ãªãã¯ã©ã¹ã§æ©èœããŸãã THREEã°ããŒãã«ãªãã§ãã®åäœã眮ãæããæåã®æ¹æ³ãããããŸããã
ãã¹ãŠãã¢ãžã¥ãŒã«ã§ããå Žåã¯ããã®ãã¿ãŒã³ïŒãŸãã¯ãã®å€åœ¢ïŒãå®è¡ã§ããŸãã
var objectType = require( "THREE." + obj.type );
ã¢ãžã¥ãŒã«ã«é¢ããŠã¯ãES6ã«äŒŽãå€ãã®å€æŽããããŸãã ãã®æç¹ã§ãThreeJSã®ã¢ãžã¥ãŒã«æ§ãåæ€èšããŸãã
ãã«ããããããŒãžã§ã³ã®3ïŒãŠãŒã¶ãŒãæåã§ããŠã³ããŒãã§ããjavascriptãã¡ã€ã«ïŒã«ã¯ã3ã€ã®åå空éã«ãã¹ãŠãå«ãŸããŠããŸãã ããã¯ããã«ãã®ãšã³ããªãã€ã³ããã¡ã€ã«ã䜿çšããŠè¡ãããšãã§ããŸãã
var THREE = {
Geometry: require("./geometry"),
ãªã©ãããã¯ãŸã åå¿è ã«ãšã£ãŠã¯äŸ¿å©ã§ãç°¡åã«å§ããããšãã§ããŸãã
ææ°ã®javascriptãã«ãã§npmãšrequirejs / browserify / webpackã®3ã€ã䜿çšããŠããå Žåã¯ã次ã®ãããªããšãã§ããŸãã
var Scene = require("three/scene"),
Camera = require("three/camera"),
ãªã©ãã¯ã©ã€ã¢ã³ããµã€ãºãã³ãã«ã«çµã¿èŸŒãŸããŠãã3ã€ã®ãµã€ãºã®äžéšãåæžããå¯èœæ§ããããŸãã 3ã€ã®ãã¡ã©ãã ãããã³ã¢ãã§ãããããããªãã®ã§ãç§ã¯ééã£ãŠããå¯èœæ§ããããŸãã ãã ããçŸæç¹ã§ã¯ã3ã€ã¯requireã¹ããŒãã¡ã³ãã䜿çšããªããããããã¯äžå¯èœã§ãã
ãããã«ãããææ°ã®ãã¿ãŒã³ã§ã¯ã¢ãžã¥ãŒã«ãå¿
èŠã§ããããã¹ãŠã®ã³ãŒãã§å¥ã®ã©ã€ãã©ãªãå€æŽããïŒã°ããŒãã«THREEãå€æŽãããæªãïŒä»£ããã«ãã³ãŒãã¯ç¬ç«ããŠã¢ãžã¥ãŒã«åããã require
ã¹ããŒãã¡ã³ãã§å¿
èŠãªãã®ãæå®ããŸãã ReactãœãŒã¹ã³ãŒããªã©ã
ããã«ã€ããŠãªã³ã©ã€ã³ã§å€ãã®è¯ããªãœãŒã¹ãããã®ã§ãrequire / moduleæ§æã䜿çšããããã®å®å šãªè°è«ãããããšããããšã¯åœ¹ã«ç«ããªããšæããŸãã ããããOrbitControlsã®ãããªãã©ã°ã€ã³ãè¿œå ããããã«3ã€ã®åå空éãå€æŽããããã«ä»ã®äººã«å§ããã®ã¯æªãããšã§ãã
@DelvarWorldã¯ãES6ãã¢ãžã¥ãŒã«ãJavaScriptã«å ¬åŒã«å°å ¥ããéåžžã«å ·äœçã§æ確ãªæ§æã䜿çšããŠããããšã«æ³šæããŠãã ããã
@bhoustonãããããç§ã¯å¿ èŠãªãã®ãšã€ã³ããŒããããã®ãåºå¥ããïŒã€ã³ããŒããããããããè¯ãéžæã§ãïŒãäžè¬çãªã¢ãžã¥ãŒã«ãã¿ãŒã³ããµããŒãããã ãã§ãã
@bhouston @DelvarWorld @kumavisç§ã®é·æçãªãããžã§ã¯ãã®1ã€ã¯ãcommonjs / amdã¢ãžã¥ãŒã«ã«å¯Ÿå¿ããŠes6ã«å€æã§ããèªåes5-> es6ã³ã³ããŒã¿ãŒãäœæããããšã§ããã§ããã°ãã¯ã©ã¹/ãžã§ãã¬ãŒã¿ãŒãªã©ã®es6ã³ã³ã¹ãã©ã¯ãã䜿çšããŠå€ãã®JavaScriptãèå¥ããŠæžãçŽããŸããçã ã ãã©ãŠã¶ãŒãæšæºã«è¿œãã€ããŠããéã«ães6ifyã®ãããªbrowserifyå€æã䜿çšããŠãã³ãŒãã䜿çšã§ããããã«æºåããããšãã§ããŸãã å éšã¬ãã«ã§3ã€ãbrowserifyã«ç§»è¡ããããšã¯ããã®ãããªããŒã«ãžã®å ¥åã®æºåãããããã®è¯ãæåã®ã¹ãããã§ãã
ããã¯ãç§ãïŒæããã«éåžžã«è²§åŒ±ã«ïŒäœãããšããŠããç¹ã®æšªã«ãããŸãã ã¢ãžã¥ãŒã«æ§ã®æžå¿µã«é¢ä¿ãªãããããã®åŸªç°äŸåé¢ä¿ãå¯èœãªéãåé€ããããšæããŸããããã«ãããTHREEãããå®å®ããŠæè»ã«ãªããå¿«é©ãªå¯äœçšãšããŠå€ãã®ãã°ããªããªããšæããŸãã
@coballast https://github.com/mrdoob/three.js/pull/6252ãããŒãžãããåšæçãªæ·±åºŠã®å€ããåæžããå¿ èŠããããŸãã æ°ããdepã°ã©ããçæã§ãããšæããŸããïŒ å€åãããå€æããŒã«ãªããžããªã®ãŠãŒãã£ãªãã£ã«ããŸã
次ã¯ã Vector3
Matrix4
ã®ã¹ã¯ã©ããå€æ°ããå®çŸ©æã§ã¯ãªããæåã®äœ¿çšæã«é
延å®çŸ©ããããšã§ãã
ãã©ã³ãã£ã¢ãããã人ã¯ããŸããïŒ éãã¯ãã§ã
ã°ã©ããæŽæ°ãããŸããã http://jsbin.com/medezu/3/
ãããã¹ã¯ãªãŒã³ã·ã§ããã§ãïŒ
èšå€§ãªæ°ã®Object3Dã®åŸªç°ãæé€ãããããšãå ±åã§ããŠããããã§ãã ãããã£ã@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
ã®äž¡æ¹ãã¯ãªãŒã³ã¢ããã§ããŸãã
ã¯ã©ã¹ã«äŸåããåäœãã¯ã©ã¹èªäœã«é©çšããªããšãããã1ã€ã®ã±ãŒã¹ã
ãœãŒã¹ïŒ
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ã«åºã¥ããŠãã©ã¡ãŒã¿ãŒãèšå®ããå¿
èŠããããŸãã
ããã«ããã埪ç°æ·±åºŠã®Box3 -> BufferGeometry
ãšBox3 -> Geometry
ã®çµãããåé€ãããŸãã äœã足ããªããã®ãããã°æããŠãã ããã
ããŒããçµæã®ã³ãŒãã¯å°ãè€éãããããŸããããããã§å®éã«æå³ãããã®ã¯äœã§ããïŒ Box3.setFromObject
ã¯ååšãã¹ãã§ã¯ãããŸããããããã¯ãªãã·ã§ã³ã§ã¯ãããŸããã Geoã¯box3ãäœæã§ããã¯ãã§ãããåé¡ã¯ãããŸããã ããã Box3.setFromObject
ã¯geoã«ããŠã³ãã£ã³ã°ããã¯ã¹/ãšã¯ã¹ãã³ããèŠæ±ããå¿
èŠããããšæããŸããããããã圌ãã¯Object3D
/ Mesh
ã«ããŠã³ãã£ã³ã°ããã¯ã¹/ãšã¯ã¹ãã³ããèŠæ±ããå¿
èŠããããŸãã
ãã¿ãŸãããå°ãã¬ã¿ã¬ã¿ããŸããã lemmeã¯ããªãã®èããç¥ã£ãŠããŸãã
ããããé¢é£æ§ãããïŒïŒ6546
ãã®ãããªãã®ããªããã°ãããŒããŒã¹ã¯ãªãããããããã®åçãªäŸåé¢ä¿ãåæããããšã¯äžå¯èœã§ãã
ç§ã®ãã¹ãã«ãããšã埪ç°äŸåé¢ä¿ã¯commonJSificationã®åé¡ã§ã¯ãããŸããã ãããã¯æ£ããåŠçããå¿ èŠãããããã®ã¹ã¬ããã§åè¿°ããããã«ãäŸåé¢ä¿ã°ã©ãã¯ããªãæ··ä¹±ããŸãããTHREE.jsãcommonJSç°å¢ã§åäœããããšã劚ããŸããïŒãã¡ãããå€æãããå ŽåïŒã
3ã€ã®commonjsãã©ã³ã¹ãã€ã©ãŒã䜿çšããŠãå®å šãªcommonjsããŒãžã§ã³ãthree.cjsãšããŠnpmã«å ¬éããŸããã
泚ïŒãããæ©èœãããã«ã¯ããã¹ã¿ãŒã§æåã§ïŒ6546ããã§ãªãŒããã¯ããå¿ èŠããããŸããã åçäŸåé¢ä¿ã¯node.jsã§ããŸãæ©èœããŸãããéçäŸåé¢ä¿åæãå®è¡ããå¿ èŠããããããBrowserifyïŒãŸãã¯ä»ã®cjs to browserããŒã«ïŒã§ã¯æ©èœããŸããã
Browserifyã®èšŒæïŒ http ïŒ//requirebin.com/ïŒgist = b7fe528d8059a7403960
@kamicane FYI-ããã§ãå¿åé¢æ°ã®åŒæ°ãšããŠTHREEãRaycaster
ïŒä»¥åã®Ray
ïŒã«è¿œå ãããŸããã
ïŒãã©ãŠã¶ã§ã®ã°ããŒãã«ãªãŒã¯ãé²ãããã®ïŒç¡åé¢æ°ã®å¿ èŠæ§ãç解ããŠããŸãããåŒæ°ã¯äžèŠã§ããããã¡ã€ã«å šäœãèšç®ãããäŸåé¢ä¿ã®ã«ããŽãªã«åé¡ãããŸãã åŒæ°ã¯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/ãåç
§ããŠãã ããïŒã blob / dev / src / math / Vector3.jsïŒL315ïŒ
@ roomle-Matrix4ã³ã³ã¹ãã©ã¯ã¿ãŒãæ瀺çã«åç §ããŠãããšããçç±ã ãã§ãIdkããã«ãããŸããïŒ ã©ãã§ãã
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
ããå§ããŸãããã
$ïŒ project
ãšunproject
$ã®ããã$ Vector3
ã¯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ã¯å®éã«ã¯ããã§ã¯ãããŸããã ããã¯ãå€ãã®å°ããªããã«ããŒãé¢æ°ãåãã1ã€ã®å€§ããªã¢ãžã¥ãŒã«ã«ãªããŸãã ããã¯ãããªãŒã®æºããªã©ã«ã圹ç«ã¡ãŸããæ°åŠã¢ãžã¥ãŒã«ã¯æ¬¡ã®ããã«ãªããŸãã
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())
);
圌ããRxJS6ã§ãã®ãããªãã®ãå€æŽãããçç±ãšæ¹æ³ãã«ã€ããŠã¯ãããã€ãã®ããã°æçš¿ã§èªãããšãã§ããŸããããšãã°ã https ïŒ//auth0.com/blog/whats-new-in-rxjs-6/
ããããç§ãèšã£ãããã«ãããã¯åãªãèãã§ããããããã³ãŒãããŒã¹ã®æ®ãã®éšåã«äžãããã¹ãŠã®åœ±é¿ã«ã€ããŠã¯ããããŸããã ãŸããçŸåšã®math
ã¢ãžã¥ãŒã«ã¯ããã®ããã«äœ¿çšããããã«ãæºåããããŠããŸããã çŸåšãæ°åŠã¢ãžã¥ãŒã«ã®ãã¹ãŠã®ã¡ãœããã¯ãäžçš®ã®éçãã«ã¢ã¿ãããããŠããŸãã ããã¯ãŸããããŒã«ã¢ãããæ¬åœã«å¿
èŠãªãã®ãæ€åºããã®ãé²ããŸã...
@ roomle-ããŒããããŒã«ã¢ããã¯åãã¹ã³ãŒãå ã®ã³ãŒããå®éã«ã¹ã³ãŒãå šäœãå¿ èŠãšããªããã©ãããç解ã§ãããšèšã£ãŠããã®ã§ãããã§ããã
ãªããžã§ã¯ãæåã¢ãããŒãïŒãªããžã§ã¯ããã¡ã³ããŒé¢æ°ãæã€ïŒã§ã¯ãªããæ©èœçã¢ãããŒãïŒãªããžã§ã¯ããåãé¢æ°ïŒã«ç§»è¡ããããšã«ã€ããŠè©±ããŠããã®ã§ããããã¯æ¬ç©ã§ãããThree.JSãå®å šã«ãªããžã§ã¯ãæåã§ããããšãèãããšããã®ã¿ã€ãã®å€æŽãææ¡ããããšã¯ããªã倧ããªãã®ã§ãããæ¢åã®ãã¹ãŠã®ã³ãŒããå£ããŠããŸããŸãã
ãã®å€æŽãæ¯æããè°è«ãããã¹ãŠã®äžäœäºææ§ãç Žãããšãæ£åœåããããã«ãçŸæç¹ã§ããã»ã©éèŠã§ãããã©ããã¯ããããŸããã
@makcã¯å®éã«ã¯ããã§ã¯ãããŸããã ããã¯ãå€ãã®å°ããªããã«ããŒãé¢æ°ãåãã1ã€ã®å€§ããªã¢ãžã¥ãŒã«ã«ãªããŸãã ããã¯ãããªãŒã®æºããªã©ã«ã圹ç«ã¡ãŸããæ°åŠã¢ãžã¥ãŒã«ã¯æ¬¡ã®ããã«ãªããŸãã
ãããææ¡ãããŠãããã®ã§ããå Žåãããã¯æ£ããèšè¿°ãããã¹ãã§ãã ããã¯ãThree.JSã®ãªããžã§ã¯ãæåã¹ã¿ã€ã«ã®ãã¶ã€ã³ããæ©èœçãªãã¶ã€ã³ãžã®å€æŽã§ãã
@ roomle-ããŒããããŒã«ã¢ããã¯åãã¹ã³ãŒãå ã®ã³ãŒããå®éã«ã¹ã³ãŒãå šäœãå¿ èŠãšããªããã©ãããç解ã§ãããšèšã£ãŠããã®ã§ãããã§ããã
ã¯ããããŒã«ã¢ããã¯ãã¹ãŠã®ã€ã³ããŒããäºãã«ã©ã®ããã«é¢é£ããŠããããç解ããããªãŒã®ã·ã§ã€ã¯ããããã³ãŒãã®é€å»ãªã©ãè¡ããŸããæ°ããããŒãžã§ã³ã®ããŒã«ã¢ããã¯ãããã£ã³ãã³ã°ãããã®ä»ã®å€ãã®åªããæ©èœãå®è¡ã§ããŸãã ããããçŸåšã®ãããžã§ã¯ãæ§é ã¯ãããã®æ©èœãååã«æŽ»çšããŠããŸããã
ãªããžã§ã¯ãæåã¢ãããŒãïŒãªããžã§ã¯ããã¡ã³ããŒé¢æ°ãæã€ïŒã§ã¯ãªããæ©èœçã¢ãããŒãïŒãªããžã§ã¯ããåãé¢æ°ïŒã«ç§»è¡ããããšã«ã€ããŠè©±ããŠããã®ã§ããããã¯æ¬ç©ã§ãããThree.JSãå®å šã«ãªããžã§ã¯ãæåã§ããããšãèãããšããã®ã¿ã€ãã®å€æŽãææ¡ããããšã¯ããªã倧ããªãã®ã§ãããæ¢åã®ãã¹ãŠã®ã³ãŒããå£ããŠããŸããŸãã
ãããã®2ã€ã®ãã©ãã€ã ã¯çžäºã«æä»çã§ã¯ãªããšæããŸãã ãããã®2ã€ã®ãã©ãã€ã ãçµã¿åãããŠçµã¿åãããããšãã§ãããšæããŸãã ãŸããé¢æ°åããã°ã©ãã³ã°ã«å€æŽããããšãææ¡ããŠããŸããã 埪ç°äŸåãåãé€ãæ¹æ³ã説æãããã£ãã ãã§ãã multiplyMatrices
ã¡ãœãããMath
ãªããžã§ã¯ãã«ã¢ã¿ããããããšãã§ããŸãã ãããã誰ãããã®çš®ã®ãã®ãæžãçŽããå ŽåãES6ã¢ãžã¥ãŒã«ã®æ©èœã®äœ¿çšãæ€èšããããšã¯çã«ããªã£ãŠããŸãã ããããç§ãèšã£ãããã«ãç§ã¯Three.jsã³ãŒãããŒã¹ã®å°é家ã§ã¯ãªãã埪ç°äŸåãæé€ââããæ¹æ³ãèããã ãã§ããã Three.jsã¯çŽ æŽãããã³ãŒãããŒã¹ãåããçŽ æŽããããããžã§ã¯ãã ãšæããŸãã ã ããç§ã¯èª°ãç§ã®ã³ã¡ã³ãã«è
¹ãç«ãŠãªãããšãé¡ã£ãŠããŸãð
ããåé¡ã§èšèšäžã®æ±ºå®ã«ã€ããŠè©±ãåãã¹ããã©ããã¯ããããŸããã ãã®çš®ã®ãã®ãããããåãå ŽæããããŸããïŒ
ãšããã§ãgl-matrixã¯æ©èœçãªæ°åŠã©ã€ãã©ãªã§ãïŒ https ïŒ//github.com/toji/gl-matrix/tree/master/src/gl-matrix
@ roomle-build
çŸåšãæ°åŠã¢ãžã¥ãŒã«ã®ãã¹ãŠã®ã¡ãœããã¯ãäžçš®ã®éçãã«ã¢ã¿ãããããŠããŸãã
ã©ãããŠïŒ
@mrdoob gl-matrixã®æ©èœèšèšã§ã¯ãããšãã°vec3ã®åæ©èœïŒä»¥åã®ã³ã¡ã³ãã§ãªã³ã¯ããvec3ãã¡ã€ã«å ïŒãåå¥ã«ãšã¯ã¹ããŒãããããšæããŸãã ããã«ãããã€ã³ããŒãããé¢æ°ãéžæã§ããŸãã ãã¹ãŠã®vec3ãæåããå¿ èŠã¯ãããŸããã
Three.JSãšåæ§ã«ããªããžã§ã¯ãæåèšèšã䜿çšããŠãããããVector3ã®ãã¹ãŠã®æ°åŠé¢æ°ãVector3ãªããžã§ã¯ãã®ãããã¿ã€ãã«ã¢ã¿ãããããVector3ã¯ã©ã¹èªäœã®ã¿ãã€ã³ããŒãããŸãã
ãããã£ãŠãThree.JSã§ã®ã€ã³ããŒãã¯ã¯ã©ã¹å šäœã§ãããæ©èœçãªã¢ãããŒãã§ã¯ãåã ã®é¢æ°ãã€ã³ããŒãããŸãã
ïŒgl-matrixã©ã€ãã©ãªã®ãã1ã€ã®éåžžã«åªããç¹ã¯ããã¹ãŠã®åã ã®é¢æ°ãä»ã®é¢æ°ã䜿çšããªãããšã§ãã @ tojiã¯åºæ¬çã«ããã¹ãŠã®æ°åŠã®æé©åãããããŒãžã§ã³ãåã ã®æäœã«ã€ã³ã©ã€ã³åããŸããããã¯ãé床ã®ç¹ã§éåžžã«å¹ççã§ãããã ããã©ã€ãã©ãªã®ä¿å®ãå°é£ã«ãªããŸããïŒ
/ mathå ã®ä»ã®ãã£ã¬ã¯ããªãžã®åç §ãåé€ããå Žåãé€ããŠãThree.JSã®ãã®éšåããªãã¡ã¯ã¿ãªã³ã°ããå¿ èŠã¯ãªããšæããŸãã æ°åŠã©ã€ãã©ãªã¯ããªãå°ãããæè¿ã®ç§ã®ãããã¡ã€ãªã³ã°ãã¹ãã«ã¯å®éã«ã¯è¡šç€ºãããŸããã ã¯ããããã¯æ倧éã«å¹ççã§ã¯ãããŸããããå¯èªæ§ãšäœ¿ãããããç¶æããªããååã«è¿ãã§ãã
@bhoustonäºè§£ããŸããã 説æããããšãããããŸãïŒ ð
ãã®ãããã¯ã«ã€ããŠãã©ããŒã¢ãããããã£ãã ãã§ãã ãããã importing function vs importing classes
ããcyclic dependencies
ã®è§£æ±ºã®ãããã¯ã«æ»ããããšæããŸãã ïŒãŸãã import { someFunction } from 'SomeModule'
ãimport SomeClass from 'SomeModule'
ãããä¿å®æ§ãäœãçç±ãããããŸããããããã¯ééããªããã®åé¡/äŒè©±ã®ãããã¯ã§ã¯ãããŸããã
埪ç°äŸåã解決ããããã«ãæ©èœãå¥ã®ã¯ã©ã¹ã«å
¥ããããšãå¯èœã§ãã multiplyMatrices
ã¡ãœãããMath-Classã«ã¢ã¿ãããããã multiplyMatrices
ã¡ãœãããæã€Multiplier-Classãäœæããããšãã§ããŸãã ããããåã«èšã£ãããã«ã埪ç°äŸåé¢ä¿ãåé€ããå¿
èŠããããã©ããã¯ããããŸããã ããããåé€ããªããšãã決å®ã§ããã°ããã®åé¡ã¯è¿ããããããªããšæããŸãð
ïŒ19137ã解決ããåŸããããéããããšãã§ããŸãðã
@ Mugen87ãããŒã5å¹ŽïŒ ã€ãã«ãããæã£ãããšãããã§ãšãïŒfire ïŒïŒ clapïŒ
åœæãç§ã¯ãããã®ã°ã©ããäœæããã®ããšãŠã楜ããã£ãã§ãïŒsmile_catïŒ
æãåèã«ãªãã³ã¡ã³ã
@ Mugen87ãããŒã5å¹ŽïŒ ã€ãã«ãããæã£ãããšãããã§ãšãïŒfire ïŒïŒ clapïŒ
åœæãç§ã¯ãããã®ã°ã©ããäœæããã®ããšãŠã楜ããã£ãã§ãïŒsmile_catïŒ