了解 .OBJ 3D 对象的位置

问题描述 投票:0回答:2

我正在尝试制作一个简单的由 THREE.js 支持的可视化,显示各种对象按帝国大厦比例缩放的样子。所以我花了 2 美元买了这个价格非常合理的型号,它有多种格式,包括

.obj
。然后我使用 THREE 的 OBJLoader 将其添加到场景中。

    container = document.getElementById("city");
    camera = new THREE.PerspectiveCamera( 60, 1, 1, 2000 );
    camera.position.set( 100, 0, -100 );

    scene = new THREE.Scene();
    scene.background = new THREE.Color( 0x87CEEB );

    var ambientLight = new THREE.AmbientLight( 0xcccccc, 0.4 );
    scene.add( ambientLight );

    // load the ESB model
    var loader = new THREE.OBJLoader();

    loader.load(
        'data/esb.obj',
        function ( object ) { // called when resource is loaded
            ESB = object;
            scene.add( object );
        },
        function ( xhr ) { // called when loading is in progresses
            console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
        },
        function ( error ) {
            console.log(error);
        }
    );

这成功加载了 OBJ 文件——此处演示。 (我会放在CodePen上,但无权重新分发OBJ。请不要窃取它!)

但是,正如您所看到的,虽然我添加了一些在远处隐约可见的 Axis Helpers,但 ESB 从左侧漂浮在其一侧:

显然我不太了解 .obj 规范,尽管我已经尝试阅读它。我的问题是:

  • OBJ 文件是否具有绝对坐标,因此,由于某种原因,ESB 会远离 <0,0,0> 的中心?
  • 为什么会动? OBJ 文件是否有动力,或者这是我在 Three.js 中所做的事情的产物?

一如既往的感谢!

3d three.js .obj
2个回答
3
投票

是的,ESB 的模型并不以原点为中心。如果将其导入 Blender,您可以轻松验证这一点。尝试通过以下方式将加载的

OBJ
重新定位到场景中心:

var boundingBox = new THREE.Box3().setFromObject( object );
boundingBox.getCenter( object.position ).negate();

物体的移动与

OBJ
格式无关。我猜想某些应用程序级别的代码会导致这种行为。


0
投票

我在另一个程序中也遇到了类似的问题。所以我写了一个工具,可以修复 obj 文件并再次将它们居中(以及其他一些东西,比如将其拆分为对象的多个文件基础)。

https://github.com/scolastico-dev/s.ACMT/

© www.soinside.com 2019 - 2024. All rights reserved.