Javascript 使用three.js渲染.stl文件时自动缩放

Javascript 使用three.js渲染.stl文件时自动缩放,javascript,3d,three.js,rendering,Javascript,3d,Three.js,Rendering,我正在尝试创建一个服务器/网页,其工作方式如下: 客户端上传一个他们想要3D打印的.stl文件 服务器在.stl文件上运行网格修复脚本 新修复的.stl文件在客户端的浏览器中呈现,这样他们就可以确认脚本没有以错误的方式修改.stl文件 我遇到的问题是步骤3。我试图使用three.js repo中的这个示例来呈现.stl文件: 问题是,如果.stl文件中的模型太大,则无法看到整个内容。 我可以通过在这个代码块中使用mesh.scale.set(x,y,z)函数中的三个参数来解决这个问题,这样整个

我正在尝试创建一个服务器/网页,其工作方式如下:

  • 客户端上传一个他们想要3D打印的.stl文件
  • 服务器在.stl文件上运行网格修复脚本
  • 新修复的.stl文件在客户端的浏览器中呈现,这样他们就可以确认脚本没有以错误的方式修改.stl文件
  • 我遇到的问题是步骤3。我试图使用three.js repo中的这个示例来呈现.stl文件:

    问题是,如果.stl文件中的模型太大,则无法看到整个内容。 我可以通过在这个代码块中使用mesh.scale.set(x,y,z)函数中的三个参数来解决这个问题,这样整个模型都可以在摄像机的视野中看到:

    var loader = new THREE.STLLoader();
    loader.addEventListener( 'load', function ( event ) {
    
        var geometry = event.content;
        var mesh = new THREE.Mesh( geometry, material );
    
        mesh.position.set( 0, - 0.37, 0 );
        mesh.rotation.set( - Math.PI / 2, 0, 0 );
        mesh.scale.set( 2, 2, 2 );
    
        mesh.castShadow = true;
        mesh.receiveShadow = true;
    
        scene.add( mesh );
    
    } );
    loader.load( './models/stl/binary/pr2_head_tilt.stl' );
    
    但是,我想知道如何自动识别.stl文件中模型的大小,并相应地进行缩放

    我知道这是可能的,因为GitHub已经通过STL文件查看器实现了这一点。 您可以通过在此处导航并单击其中一个.stl文件来查看其工作原理:


    基本上,GitHub STL文件查看器正是我想要模拟的,因为它可以干净地加载任何.STL文件,而无需用户放大/缩小以正确查看模型。

    模型在视口中的可见程度取决于相机参数和场景设置。 您可以使用几何体的.boundingBox或.boundingSphere来计算模型有多大,然后使用一些启发式方法将其适当地放大或缩小,以达到您想要的效果。还有一个BoundingBoxHelper,可以帮助您可视化模型的延伸

    此外,您还可以查看: 和

    这几乎是唯一的办法?最简单的方法可能是使用边界框将每个模型缩放到相同的高度。稍微优雅一点的可能是将边界框投影到摄影机空间中,然后从那里获取值,比如说,如果模型太“深”。在不缩放模型的情况下,在负视图方向移动相机也会产生相同的效果。谢谢,gaitat。拥有边界框顶点后,问题将简化为在摄影机视图中拟合立方体。在以下公认答案中概述了“扩大规模的启发式方法”: