Three.js - 旋转后更大的边界框

Ioa*_*a B 5 javascript three.js

所以我有这个代码:

computeCarBoundingBox(mesh);

mesh.rotation.x = this.rotationVal[ 0 ];
mesh.rotation.y = this.rotationVal[ 1 ];
mesh.rotation.z = this.rotationVal[ 2 ];
Run Code Online (Sandbox Code Playgroud)

当我尝试计算网格的边界框时,如果我在旋转后计算它,则如下所示: 第一张图片

如果我在旋转后计算它,如下所示: 第二

从上往下数第二张图片

我的计算边界框函数是这样的:

function computeCarBoundingBox(mesh){

        var box = new THREE.Box3().setFromObject(mesh);

        var boundingBoxHelper = new THREE.Box3Helper( box, 0xffff00 );  
        scope.carBoundingBox =boundingBoxHelper;
        scene.add(scope.carBoundingBox);
        console.log(box.min); // x, y, and z are all Infinity.
        console.log(box.max); // x, y, and z are all -Infinity.


}
Run Code Online (Sandbox Code Playgroud)

我确实有几何学。这是我的代码的一部分:

this.loadCar = function ( carsVector,carName,roadName ) {
    if(carName=='veyron')
    {
        var index = 0;

    }
    else if(carName=='F50')
    {
        var index = 1;
    }
    else
    {
        var index = 2;
    }
    console.log("Selected car name:"+carName);
    var carLoader = new THREE.BinaryLoader();
    carLoader.load( carsVector[Object.keys(carsVector)[index]].url, function( geometry ) { 

        geometry.sortFacesByMaterialIndex();
        console.log("url--->"+carsVector[Object.keys(carsVector)[index]].url);


        var materials = [];
        this.scaleVal = carsVector[ Object.keys(carsVector)[index] ].scale * 1;
        if(roadName =='road01'){
            this.positionVal = carsVector[ Object.keys(carsVector)[index] ].position_r1;
        }
        else if(roadName=='road02'){
            this.positionVal = carsVector[ Object.keys(carsVector)[index] ].position_r2;
        }

        this.rotationVal = carsVector[ Object.keys(carsVector)[index] ].init_rotation;


        for ( var i in carsVector[ Object.keys(carsVector)[index] ].materialsMap ) {
            materials[ i ] = carsVector[ Object.keys(carsVector)[index] ].materialsMap[ i ];
        }
        createObject(geometry,materials);
    });

    return scope.carMesh;

}


    // internal helper methods

function createObject ( geometry, materials ) {

    scope.carGeometry = geometry;
    scope.carMaterials = materials;

    createCar();

};

function createCar () {
    console.log("CREATE CARRRRRRRRRRRRRRRRR");
    if ( scope.carGeometry ) {
        var carMaterial = new THREE.MeshFaceMaterial( scope.carMaterials );
        var mesh = new THREE.Mesh( scope.carGeometry, carMaterial );



        mesh.scale.x = mesh.scale.y = mesh.scale.z = this.scaleVal;

        mesh.position.set( this.positionVal[0], this.positionVal[1], this.positionVal[2]);



                mesh.rotation.x = this.rotationVal[ 0 ];
                mesh.rotation.y = this.rotationVal[ 1 ];
                mesh.rotation.z = this.rotationVal[ 2 ];
                this.carMesh = mesh;

                //
                    computeCarBoundingBox(mesh);

                console.log("This car mesh"+this.carMesh);
                addShadows();
                scene.add(this.carMesh);

                //this.carBoundingBox.rotation.x =this.r[0];
                //this.carBoundingBox.rotation.y = this.r[1];
                //this.carBoundingBox.rotation.z = this.r[2];
                //scene.add( this.carBoundingBox );
    }

    if ( scope.callback ) {

        scope.callback(this.carMesh);

    }

}
Run Code Online (Sandbox Code Playgroud)

ipp*_*ppi -1

好吧,我有两种理论,但没有确定的答案。对不起!

1) 网格可以没有几何体。你的网格有几何形状吗?如果不是,从 setFromObject 调用的代码将会失败。(expandByPoint 将永远不会被调用,并且自上次 makeEmpty 调用以来,min 和 max 将保持为无穷大)。

2)看到递归“expandByOject”代码对作用域和的依赖程度如何this,我会尝试在新运算符中添加括号,var box = (new THREE.Box3()).setFromObject(mesh);这有点盲目,但也许作用域从未正确设置。

很抱歉没有花时间先进行测试。