如何在threejs中居中和缩放对象

9
我正在使用以下代码对加载使用ObjectLoader压缩的msgpack对象进行缩放和居中处理,但无法正常工作。我认为我的对象有一个旋转,因此导致一些奇怪的行为。对于某些对象,它成功地居中,但对于其他对象,居中偏移且缩放也不正确。

在这个片段中,result是从ObjectLoader获得的场景。我的想法是对象没有很好的形成,但我不确定。我希望图像上的桌子或任何其他用户输入的网格位于网格的顶部,并以最大大小为1个单位进行居中和缩放。

每个正方形尺寸为0.25,轴位于0,0,0 http://i.stack.imgur.com/fkKYC.png

    // result is a threejs scene        
    var geometry = result.children[0].geometry;
    var mesh = result.children[0];
    geometry.computeBoundingBox();
    var middle = new THREE.Vector3();
    middle.x        = ( geometry.boundingBox.max.x + geometry.boundingBox.min.x ) / 2;
    middle.y        = -geometry.boundingBox.min.y;
    middle.z        = ( geometry.boundingBox.max.z + geometry.boundingBox.min.z ) / 2;
    middle.negate();
    mesh.position.copy(middle);
    // scales the mesh up to maxsize
    var maxSize = 1;
    // gets the biggest axis
    var maxVal = geometry.boundingBox.max.x - geometry.boundingBox.min.x;
    if (maxVal < geometry.boundingBox.max.y - geometry.boundingBox.min.y) {
        maxVal = geometry.boundingBox.max.y - geometry.boundingBox.min.y;
    }
    if (maxVal < geometry.boundingBox.max.z - geometry.boundingBox.min.z) {
        maxVal = geometry.boundingBox.max.z - geometry.boundingBox.min.z;
    // scales the current size proportional to the maxval, times maxsize
    mesh.scale.divideScalar(maxVal * maxSize);

    self.scene.add(result);

边界框是物体周围的红色正方形。 - Diogo Bernini Milagres
1个回答

7

不要调用geometry.computeBoundingBox();,而是调用geometry.center();,然后你就不需要middle.xmiddle.z,可以直接调用mesh.translateY(),而无需处理middle


那么我如何知道translateY的参数,因为对象是由用户上传的?我也必须使用边界框,并使用middle.y吗? - Diogo Bernini Milagres
.center()已经为您设置了边界框,因此在那一点上只需要进行简单的算术运算。 - bjorke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接