加载.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 :(得分:1)
这是可能的,但在您的情况下似乎objMesh
是function ( 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()
}
} );
然后将mrdoob的代码应用于mesh
变量,而不是objMesh
。
或者,您可以将mrdoob的代码包装在函数中,然后使用网格参数在回调onLoad
函数中调用此函数:
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
}
} );