Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3d 物体的中心_3d_Three.js - Fatal编程技术网

3d 物体的中心

3d 物体的中心,3d,three.js,3d,Three.js,我试图检索并绘制一些对象的中心点,但我一直得到所有对象的相同值,即x=0、y=0和z=0。因此,我的中心点始终是场景的中心点。我目前正在阅读3D计算机矩阵,所以我在这方面有点新手。我是否需要以某种方式更新场景,或者在每次添加对象或其他内容后更新一些矩阵 function initBoxes(){ var box = new THREE.Mesh(geometry, material); box.position.set(0, 2, 2); getCenterPoint(b

我试图检索并绘制一些对象的中心点,但我一直得到所有对象的相同值,即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;
}

对象
边界框
位于局部空间中。如果要在世界空间中设置中心,则必须将
中间的
顶点转换为世界空间。您可以使用以下方法轻松完成此操作:

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版本中,
three.Box3
类中有

function getCenterPoint(mesh) {
    var geometry = mesh.geometry;
    geometry.computeBoundingBox();
    var center = new THREE.Vector3();
    geometry.boundingBox.getCenter( center );
    mesh.localToWorld( center );
    return center;
}
请尝试以下代码:

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

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

谢谢您的回答。现在可以了,但是。。。。你能给我指一下坐标系的正确方向吗?我觉得很困惑。有局部坐标、全局坐标和世界坐标?全局坐标和世界坐标是一回事。世界空间是全局坐标系(相对于场景的原点)。局部空间是相对于对象本身原点的局部坐标系。getCenter现在接收向量。要删除警告,请使用:
constcenter=new THREE.Vector3();geometry.boundingBox.getCenter(center)
@Rashomon谢谢你的评论,我做了相应的更新。你能详细解释一下吗?这个答案有一些问题。我的朋友给我指出了一个类似的解决方案:上面的链接指向
master
分支。以下链接指向截至发表上述评论时的当前提交: