我正在尝试制作一个简单的由 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 规范,尽管我已经尝试阅读它。我的问题是:
一如既往的感谢!
是的,ESB 的模型并不以原点为中心。如果将其导入 Blender,您可以轻松验证这一点。尝试通过以下方式将加载的
OBJ
重新定位到场景中心:
var boundingBox = new THREE.Box3().setFromObject( object );
boundingBox.getCenter( object.position ).negate();
物体的移动与
OBJ
格式无关。我猜想某些应用程序级别的代码会导致这种行为。
我在另一个程序中也遇到了类似的问题。所以我写了一个工具,可以修复 obj 文件并再次将它们居中(以及其他一些东西,比如将其拆分为对象的多个文件基础)。