如何在three.js中获取加载.obj的绝对位置?

时间:2016-11-29 10:38:03

标签: javascript 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

加载的网格物体无法实现这一点吗?

1 个答案:

答案 0 :(得分: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()
            }

        } );

然后将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
            }

        } );