子オブジェクトの境界球を生成しようとしています。残念ながら、適切な位置を取得する方法がわかりません。子オブジェクトが明らかに中央に配置されていない場合でも、位置ベクトルは依然として 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
ジオメトリが作成される方法を再構築しようとしました。次に、属性配列へのアクセスを許可するフラグを設定します。メッシュが生成されると、関数を使用して単純化されたメッシュを生成しますuseBuffers
false
dynamic
THREE.BufferGeometry
true
createSelectionDummy
THREE.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}) ));
};