Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript three.js中边界框的坐标错误_Javascript_Three.js_Webgl - Fatal编程技术网

Javascript three.js中边界框的坐标错误

Javascript three.js中边界框的坐标错误,javascript,three.js,webgl,Javascript,Three.js,Webgl,我对three.js中的边界框有一些奇怪的行为。 我使用STLLoader,对于一些模型,一切都很好,但对于其中一些模型,框是移动的。 例如: 及 边界框大小正确,其位置为(0,0,0)。同一位置已加载STL模型 这是我的代码: function stlLoader() { var redPhongMaterial = new THREE.MeshPhongMaterial({ color: 0xFFEA32, side: THREE.DoubleSide, ambient

我对three.js中的边界框有一些奇怪的行为。 我使用STLLoader,对于一些模型,一切都很好,但对于其中一些模型,框是移动的。 例如:

边界框大小正确,其位置为(0,0,0)。同一位置已加载STL模型

这是我的代码:

function stlLoader() {
         var redPhongMaterial = new THREE.MeshPhongMaterial({ color: 0xFFEA32, side: THREE.DoubleSide, ambient:0x000000}); // yellow
            var stlLoader = new THREE.STLLoader();
            stlLoader.addEventListener('load', function (event) {
                    var stlGeometry = event.content;
                    var mesh = new THREE.Mesh(stlGeometry, redPhongMaterial);
                    mesh.scale.set(2, 2, 2);
                    mesh.castShadow = true;
                    mesh.receiveShadow = true;
                    stlGeometry.computeBoundingBox();
                    var boundingBox = mesh.geometry.boundingBox.clone();
                    drawBoundingBox(boundingBox, mesh.scale.x, mesh.scale.y, mesh.scale.z);
                    mesh.position.y = 0;
                    mesh.position.x = 0;
                    mesh.position.z = 0;
        scene.add( mesh );
                    loadComplete();
                } );
            stlLoader.load( ptsfilestoload );
    }

    function drawBoundingBox(box, scaleX, scaleY, scaleZ)
    {
        var length = scaleX * (box.max.x - box.min.x);
        var height = scaleY * (box.max.y - box.min.y);
        var depth =  scaleZ * (box.max.z - box.min.z);
        var boundingBoxGeometry = new THREE.CubeGeometry( length, height, depth );
        for ( var i = 0; i < boundingBoxGeometry.faces.length; i ++ ) 
        {
             boundingBoxGeometry.faces[i].color.setHex( Math.random() * 0xffffff );
        }
        var boundingBoxMaterial = new THREE.MeshBasicMaterial( { color: 0xffffff, vertexColors: THREE.FaceColors, transparent: true, opacity: 0.7 } );
        var boundingBoxMesh = new THREE.Mesh( boundingBoxGeometry, boundingBoxMaterial);
        scene.add( boundingBoxMesh );
    }
函数stlLoader(){
var redPhongMaterial=new THREE.MeshPhongMaterial({color:0xFFEA32,side:THREE.DoubleSide,ambient:0x000000});//黄色
var stlLoader=new THREE.stlLoader();
stlLoader.addEventListener('load',函数(事件){
var stlGeometry=event.content;
var mesh=新的三点网格(stlGeometry,redPhongMaterial);
网格。比例。设置(2,2,2);
mesh.castShadow=true;
mesh.receiveShadow=true;
stlGeometry.computeBoundingBox();
var boundingBox=mesh.geometry.boundingBox.clone();
drawBoundingBox(边界框,mesh.scale.x,mesh.scale.y,mesh.scale.z);
网格位置y=0;
网格位置x=0;
网格位置z=0;
场景。添加(网格);
loadComplete();
} );
stlLoader.load(ptsfilestoload);
}
函数drawBoundingBox(box、scaleX、scaleY、scaleZ)
{
变量长度=scaleX*(box.max.x-box.min.x);
变量高度=比例*(box.max.y-box.min.y);
变量深度=scaleZ*(box.max.z-box.min.z);
var boundingBoxGeometry=新的三个立方体(长度、高度、深度);
对于(变量i=0;i

或者这就是STLLoader的问题?我对webgl和three.js非常陌生,因此非常感谢您在drawBoundingBox例程中提供的任何帮助

var bboxCenter = box.center ();
boundingBoxMesh .translateX (bboxCenter.x);
boundingBoxMesh .translateY (bboxCenter.y);
boundingBoxMesh .translateZ (bboxCenter.z);

在将网格添加到场景之前。您的立方体是在0,0,0左右创建的。

谢谢,gaitat!这正是我想要的。只需添加一个小部件即可正常使用缩放:boundingBoxMesh.translateX(scaleX*bboxCenter.x);哦,还有一个小问题:如何加载对象使其中心适合坐标系点(0,0,0)?在我的问题的屏幕截图上,您可以看到对象的中心有时从(0,0,0)移动,而不是从mesh.position.x=0说mesh.position.x=-bboxCenter.x,并且不要忘记更新边界框位置。