1

子オブジェクトの境界球を生成しようとしています。残念ながら、適切な位置を取得する方法がわかりません。子オブジェクトが明らかに中央に配置されていない場合でも、位置ベクトルは依然として 0,0,0 です。

オブジェクトのインポートに UTF8Loader を使用しており、「標準」の頂点配列にアクセスできません。

さらに、親の中心からの距離によって境界半径が計算されるように見えます。

何か案は?

ライブデモ:

このデモ アカウントでログインします: http://threever.org/login ユーザー:デモパスワード: demoacc

にアクセスしてください: threever.org/editor

問題の写真: 写真

オブジェクトをトラバースするときのコード スニペット:

object.traverse( function( node ) {
    if( node.geometry ) {
        if(node.geometry.boundingSphere){
            [...]
            var sphere = new THREE.Mesh( spheregeometry, material);
            sphere.position.copy(node.position);
            [...]
            _this.scene.add(sphere);
        }
    }
});

編集:マトリックスの位置を更新するために 、説明されているワークフロー( @WestLangleyに感謝)を試しましたが、まだ運がありませんでした。バウンディング球体も正しく生成されていないように見えるため (一般に大規模に)、別のアプローチを試すことにしました。メッシュがTHREE.BufferGeometry[ない?]の場合は難しい)。そこで、ファイルを調べて、 が のときにTHREE.UTF8Loaderジオメトリが作成される方法を再構築しようとしました。次に、属性配列へのアクセスを許可するフラグを設定します。メッシュが生成されると、関数を使用して単純化されたメッシュを生成しますuseBuffersfalsedynamicTHREE.BufferGeometrytruecreateSelectionDummyTHREE.Geometryアトリビュート Arrays を使用したメッシュのバージョン (UV なし、マージされた頂点、法線ベクトル (0,0,0))。このテクニックについてどう思いますか?に対してパフォーマンスが向上しますuseBuffers:falseか?

this.createSelectionDummy = function( indices, positions ) {

    var geom = new THREE.Geometry();

    for( var i = 0; i < indices.length; i += 3 ) {

        geom.vertices.push( new THREE.Vector3( positions[ i*3 ], positions[ i*3+1 ], positions[ i*3+2 ] ) );
        geom.vertices.push( new THREE.Vector3( positions[ i*3+3 ], positions[ i*3+4 ], positions[ i*3+5 ] ) );
        geom.vertices.push( new THREE.Vector3( positions[ i*3+6 ], positions[ i*3+7 ], positions[ i*3+8 ] ) );

        geom.faces.push( new THREE.Face3( indices[ i ], indices[ i + 1 ], indices[ i + 2 ], new THREE.Vector3(0,0,0) , null, 0 ) ); 

    }

    //reduce mesh size by 3
    geom.mergeVertices();
    geom.computeCentroids();
    geom.computeFaceNormals();

    return (new THREE.Mesh( geom, new THREE.MeshBasicMaterial({wireframe:true}) ));

};
4

1 に答える 1

2

次のように、オブジェクトのワールド位置を取得できます。

var position = object.matrixWorld.getPosition();

オブジェクトのワールド マトリックスが最初に更新されていることを確認することが重要です。これは通常、各レンダリング呼び出しで発生します。ただし、何らかの理由でそうでない場合は、最初に次を呼び出すことができます。

object.updateMatrixWorld( true );

object.geometry.boundingSphere.radiusこの方法で境界球の半径を計算できます。

object.geometry.computeBoundingSphere();
于 2012-11-09T04:20:20.857 に答える