Three.js: 埪環䟝存

䜜成日 2015幎03月16日  Â·  81コメント  Â·  ゜ヌス: mrdoob/three.js

こんにちは、みなさん。

@kumavisず私は、THREE.jsをbrowserifyアヌキテクチャに移行する効率的な方法を芋぀けるために䞀生懞呜取り組んできたした。 すべおのファむルをbrowserifyビルドシステムに移動し、gulpを䜿甚しおthree.min.jsを生成できるようになるたで、順調に進歩したした。

残念ながら、commonjsずは異なり、browserifyは埪環䟝存関係を凊理できないため、䟋は機胜したせん。これは、THREE.jsに倚数ありたす。

ここで、䟝存関係を衚すむンタラクティブなグラフを䜜成したした。

これらが解けるたで、THREE.jsをbrowserifyビルドに移行するこずはできたせん。

私はこれをbrowserifyの欠陥ではなく、THREE.jsの問題だず考えおいたす。 埪環䟝存は、䞀般的に゜フトりェアにあるのは悪いこずであり、あらゆる皮類の問題を匕き起こしたす。

Suggestion

最も参考になるコメント

@ Mugen87うわヌ、5幎 ぀いにそれを打ったこずをおめでずうfire  clap
圓時、私はそれらのグラフを䜜成するのがずおも楜しかったですsmile_cat

党おのコメント81件

それは解くためのかなりの結び目です
http://jsbin.com/medezu/2/edit?html、js、output
image

@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がありたす
image
少し芋づらいですが、 Geometryは、基本クラスで䞀方向の深さが良いようです。
image
LightずCameraは同様の状況にありたす。基本クラスに関しおは良奜ですが、 Object3Dの䟝存関係は䞍芁のようです。
image
image
Curve s Path s Lineは良さそうですが、 Shapeは少し絡み合っおいたす。
image

@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埪環䟝存の問題にも遭遇したした。 これは䞻に、埪環参照ファむル内に特定のオブゞェクトを事前に䜜成しようずしおいる堎合に問題になりたす。

6252は、 MaterialずObject3Dの倚くの埪環深床をクリアする必芁がありたす。

Meshは次のようになりたす。 たぶん、いく぀かの無関係なデップですが、あたりクレむゞヌではありたせん。
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 $を廃止したす。

誰かがこれらのいく぀かを修正する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構造を持぀小さなモゞュヌルに分割されるこずを完党にサポヌトしたす。

  1. THREEは非垞に倧きいです。 ナヌザヌが必芁なものだけを芁求できる堎合は、クラむアントのビルドサむズを削枛できたす。 たずえば、 react-bootstrapを䜿甚するず、すべおのブヌトストラップモゞュヌルをバンドルしないvar Alert = require('react-bootstrap/lib/Alert');のようなこずができたす。
  2. 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に公匏に導入し、非垞に具䜓的で明確な構文を䜿甚しおいるこずに泚意しおください。

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

@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/

これがスクリヌンショットです

snapshot3

膚倧な数のObject3Dの埪環が排陀されたこずを報告できおうれしいです。 よくやった@kumavis

うわヌ、それは同じコヌドベヌスですか クレむゞヌ

グラフ生成をナヌティリティの䞀郚にする䜜業を行いたす。

グラフだけを芋るず、 ShapeずGeometryは、解明できる可胜性のあるクラスツリヌのようです。

@coballastはあなたがこれを匕き受けるこずができるず思いたすか

Vector3 Matrix4のスクラッチ倉数を、定矩時間ではなく、最初の䜿甚時に遅延定矩する

これは、自動倉曎ではなく、アップストリヌムdevに察するPRになりたす

たた、問題のタむトルを「深刻な埪環䟝存の問題」から「埪環䟝存」にダりングレヌドできるず思いたす。状況は倧幅に改善されたした。

@kumavisもちろんです。 時間が蚱せばそれに取り組みたす。

これが、盞互䟝存関係のクリヌンアップの珟圚の状態です。
矢印は、必芁に応じお削陀する必芁がある接続を瀺しおいたす

  • [x]材料
  • [x]ゞオメトリ
  • [x] Object3Dの
  • [x]æ•°å­Š
  • [x]圢状

    • [x]圢状-> FontUtils

    • [x]圢状-> ExtrudeGeometry

    • [x]圢状-> ShapeGeometry

    • [x]パス->圢状

  • [] Box3

    • [] 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の䞡方をクリヌンアップできたす。

クラスに䟝存する動䜜をクラス自䜓に適甚しないずいうもう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

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡