【问题标题】:Three.js r68 - Can't get centroids of geometries using OBJMTLLoaderThree.js r68 - 无法使用 OBJMTLLoader 获取几何的质心
【发布时间】:2014-10-05 16:22:03
【问题描述】:

我使用 Three.js 的旧版本已经有一段时间了,所以我决定升级到最新版本 (r68)。我知道我会遇到一些问题,但我没想到会删除 geometry.computeCentroids() 和 .centroid 属性。

我正在使用 OBJMTLLoader 库加载模型。问题在于,由于它不再具有 .computeCentroids() 方法,因此我无法获得它们。我尝试使用其他方法计算它们,但无济于事:

我也尝试使用 .localToWorld(point) 方法,但它们也不起作用。它总是返回 (0,0,0)。

现在,当我点击一个网格时,我正在计算(或尝试计算)它的质心:

 if (mesh.centroid === undefined) {
    mesh.centroid = new THREE.Vector3();
    mesh.centroid = mesh.geometry.center();
    console.log(mesh.centroid); }

每当我向场景(具有子网格)添加新对象时,我也会使用它:

//desperate try to find different values for centroids
object.updateMatrix();
scene.updateMatrix();
object.updateMatrixWorld();
scene.updateMatrixWorld();

更奇怪的是,我试图计算的质心并不一致。 无论我按什么顺序单击网格,它总是在 console.log() 中显示相同的向量。

THREE.Vector3 {x: 158.89799999999997, y: -4.115949999999998, z: 67.75310000000002, constructor: function, set: function…}
THREE.Vector3 {x: 0.000005004882780212938, y: 0.16375010757446518, z: 0.0000024658203301441972, constructor: function, set: function…}
THREE.Vector3 {x: -1.7053025658242404e-13, y: -0.0818749484539012, z: 1.1368683772161603e-13, constructor: function, set: function…}

我想知道是否有人对此有类似的问题。我没有尝试过以前的three.js 版本,因为我真的很想升级到最新版本并从那里保持一致。

提前谢谢你。

编辑:忘记提及一个重要细节。我想要 WORLD 坐标中的质心。

使用 mrdoob 的方法后,我能够得到一个质心。我总是为每个网格获得相同的值,因为即使我在每个网格上使用 .calculateBoundingBoxes(),这些边界也是指主父对象。 每个几何体都分配了对象的所有顶点,我假设边界框是根据这些顶点计算的,这就是为什么我会为每个几何体获得相同的值。

【问题讨论】:

标签: javascript three.js centroid


【解决方案1】:

如果您想计算整个几何的质心,这就是您需要的代码:

geometry.computeBoundingBox();

var centroid = new THREE.Vector3();
centroid.addVectors( geometry.boundingBox.min, geometry.boundingBox.max );
centroid.multiplyScalar( - 0.5 );

centroid.applyMatrix4( mesh.matrixWorld );

【讨论】:

  • 我尝试使用上述方法,但每个对象的质心都相同:THREE.Vector3 {x: 158.89799999999997, y: -3.9521999999999977, z: 67.75310000000002, constructor: function, set: function…} 我刚刚编辑了我的问题,因为我忘记了一个重要细节:我想使用计算的世界坐标质心。
  • 用世界空间位更新了答案。
  • 感谢您的帮助!我发现具有相同值的问题可能与 Loader 本身有关,但我现在确实有完整对象的世界坐标。
  • 我不得不将 centroid.multiplyScalar( - 0.5 ); 更改为 centroid.multiplyScalar( 0.5 );。 OBJLoader r73
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多