2016-11-29 15 views
2

three.jsでロードされた.objの絶対位置を取得する方法は? .objファイルの読み込み

 loader.load('test.obj', function (objMesh) { 
       objMesh.traverse(function (child) { 
       if (child instanceof THREE.Mesh) { 
         child.material = mat2; 
       } 
      }); 

私はmrdoobsコードで位置を見つけることを試みた:

objMesh.geometry.computeBoundingBox(); 

var boundingBox = objMesh.geometry.boundingBox; 

var position = new THREE.Vector3(); 
position.subVectors(boundingBox.max, boundingBox.min); 
position.multiplyScalar(0.5); 
position.add(boundingBox.min); 

position.applyMatrix4(objMesh.matrixWorld); 

alert(position.x + ',' + position.y + ',' + position.z); 

は、しかし、これは

objMesh.geometry is undefined 

で失敗するこれは、ロードされたメッシュでは不可能ですか?

+0

でそれを呼び出す:あなたが関数内mrdoobのコードをラップしてから、メッシュのパラメータでコールバックonLoad機能で、この機能を呼び出すことができます

あるいは、 _Mesh_ _object_をどこに作成しますか? –

+0

次の例の場合、少し修正したバージョンを使用しました。https://github.com/mrdoob/three.js/blob/master/examples/webgl_loader_obj.html –

+1

_objMesh_オブジェクトの作成が「null」でないか、または'undefined'ですか? –

答えて

1

あなたのケースではobjMeshfunction (objMesh) {...}の範囲内のローカル変数であるようです。

だからのはmeshを言うし、その後onLoadコールバック関数

var mesh; 
... 
loader.load('test.obj', function (objMesh) { 
      objMesh.traverse(function (child) { 
      if (child instanceof THREE.Mesh) { 
        child.material = mat2; 
        mesh = child; // set value to the global variable, applicable, if the objMesh has one child of THREE.Mesh() 
      } 

     }); 

内にその値を設定してmesh変数ではなく、objMeshにmrdoobのコードを適用でき、グローバル変数を宣言することができます。

function absPos(myMesh){ 
    myMesh.geometry.computeBoundingBox(); 

    var boundingBox = myMesh.geometry.boundingBox; 

    var position = new THREE.Vector3(); 
    position.subVectors(boundingBox.max, boundingBox.min); 
    position.multiplyScalar(0.5); 
    position.add(boundingBox.min); 

    position.applyMatrix4(myMesh.matrixWorld); 

    alert(position.x + ',' + position.y + ',' + position.z); 
} 

コールバック関数

loader.load('test.obj', function (objMesh) { 
      objMesh.traverse(function (child) { 
      if (child instanceof THREE.Mesh) { 
        child.material = mat2; 
        absPos(child); // call our function 
      } 

     }); 
+0

うーん、解決策ではないようです。自分の間違いを避けるために、私はちょうどthree.jsの例をhttps://github.com/mrdoob/three.js/blob/master/examples/webgl_loader_obj.htmlから取り出し、関数とabsPos(オブジェクト)をscene.addの下に追加しましたオブジェクト);結果:TypeError:myMesh.geometryは定義されていません –

+0

ええ、私のせいです。私は答えを更新しました。 'objMesh'は' THREE.Mesh() 'の子オブジェクトである' object'ですが、もちろん 'object'には' geometry'プロパティがありません。 – prisoner849

+0

uhm、まだ残っていません。myMesh.geometryは未定義です。myMesh.geometry.computeBoundingBox();を指しています。私は子供たちが.objからインポートされた場合、子どもが3つの典型的なジオメトリを持っていないと仮定していますが、ちょっと推測すると –

関連する問題