【问题标题】:threejs get center of objectthreejs 获取对象的中心
【发布时间】:2016-11-13 07:26:29
【问题描述】:

我试图检索和绘制一些对象的中心点,但我的所有对象都得到相同的值,即 x=0、y=0 和 z=0。所以我的中心点始终是场景的中心点。我目前正在阅读 3D 计算机矩阵,所以我在这方面有点新手。我是否需要以某种方式更新场景或在每个添加对象或其他内容后更新一些矩阵?

function initBoxes(){
    var box = new THREE.Mesh(geometry, material);
    box.position.set(0, 2, 2);
    getCenterPoint(box);

    var box2 = new THREE.Mesh(geometry, material);
    box2.position.set(0, 6, 6);
    getCenterPoint(box2);
}

function getCenterPoint(mesh) {
    var middle = new THREE.Vector3();
    var geometry = mesh.geometry;

    geometry.computeBoundingBox();

    middle.x = (geometry.boundingBox.max.x + geometry.boundingBox.min.x) / 2;
    middle.y = (geometry.boundingBox.max.y + geometry.boundingBox.min.y) / 2;
    middle.z = (geometry.boundingBox.max.z + geometry.boundingBox.min.z) / 2;

    return middle;
}

【问题讨论】:

    标签: 3d three.js


    【解决方案1】:

    对象boundingBox 在本地空间中。如果您想要世界空间的中心,您必须将您的middle 顶点转换为世界空间。您可以使用the THREE.Object3D localToWorld 方法轻松做到这一点,如下所示:

    function getCenterPoint(mesh) {
        var middle = new THREE.Vector3();
        var geometry = mesh.geometry;
    
        geometry.computeBoundingBox();
    
        middle.x = (geometry.boundingBox.max.x + geometry.boundingBox.min.x) / 2;
        middle.y = (geometry.boundingBox.max.y + geometry.boundingBox.min.y) / 2;
        middle.z = (geometry.boundingBox.max.z + geometry.boundingBox.min.z) / 2;
    
        mesh.localToWorld( middle );
        return middle;
    }
    

    更新:

    在较新的 three.js 版本中,a convenience method getCenterTHREE.Box3 类中。

    function getCenterPoint(mesh) {
        var geometry = mesh.geometry;
        geometry.computeBoundingBox();
        var center = new THREE.Vector3();
        geometry.boundingBox.getCenter( center );
        mesh.localToWorld( center );
        return center;
    }
    

    【讨论】:

    • 感谢您的回答。它现在有点用,但是....你能否指出我在哪里阅读坐标系的正确方向?我觉得很混乱。有本地坐标、全球坐标和世界坐标吗?
    • 全局空间和世界空间是一回事。世界空间是全局坐标系(相对于场景的原点)。局部空间是相对于对象本身原点的局部坐标系。
    • getCenter 现在接收一个向量。要删除警告,请使用:const center = new THREE.Vector3(); geometry.boundingBox.getCenter(center)
    【解决方案2】:

    试试下面的代码:

    let box = new THREE.Box3().setFromObject(myObject3D)
    let sphere = box.getBoundingSphere()
    let centerPoint = sphere.center
    

    THREE.Box3().setFromObject(Object3D) 将遍历 Object3D 的几何图形,并返回它们的整体边界框。

    【讨论】:

    猜你喜欢
    • 2016-09-10
    • 2015-07-12
    • 2019-04-23
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多