Three.js Child Mesh位置总是返回(0,0,0)

时间:2013-01-24 02:39:26

标签: three.js mesh

我通过OBJLoader加载了一些对象,加载的对象包含一个父对象和多个子对象;然后我申请Raycaster并找到被点击的孩子。

然后我想更新子对象的位置,但所有孩子的初始位置都为零。

var intersect = intersects[0].object;
intersect.position.y = intersect.position.y + 5; // 0 + 5 

但在我的场景中看起来都很好。此外,如果我删除被点击的对象,实际上它是从场景中删除。我想我错过了一些观点,他们的位置不能(0,0,0)。我怎样才能达到他们的相对位置?

4 个答案:

答案 0 :(得分:2)

该职位相对于父母

通过父变换乘以位置以获得世界空间坐标,如果这是您正在寻找的

答案 1 :(得分:2)

试试这个,然后读取位置()。我有同样的问题,在这里得到答案。 (geom是你的网格几何体。)

objMesh.centroid = new THREE.Vector3();
for (var i = 0, l = geom.vertices.length; i < l; i++) {
    objMesh.centroid.add(geom.vertices[i].clone());
}
objMesh.centroid.divideScalar(geom.vertices.length);
var offset = objMesh.centroid.clone();

objMesh.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-offset.x, -offset.y, -offset.z));

objMesh.position.copy(objMesh.centroid);

答案 2 :(得分:1)

以下是将“变换控制”设置为对象中心的代码:

let objLoader = new THREE.OBJLoader();
    let mtlLoader = new THREE.MTLLoader();
    mtlLoader.load("path/to/mtlFile.mtl", (materials) => {
        materials.preload();
        objLoader.setMaterials(materials).load("path/to/objFile.obj", (object3d) => {
            object3d.traverse((child) => {
                if (child instanceof THREE.Mesh) {
                    child.geometry.computeBoundingBox();
                    let matrix = new THREE.Vector3();
                    let offset = child.geometry.boundingBox.getCenter(matrix);
                    child.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-offset.x, -offset.y, -offset.z));
                    child.position.copy(offset);
                    objects.push(child);
                }
            });
            scene.add(object3d);
        });
    });

答案 3 :(得分:0)

这是因为obj文件中的所有对象都在世界0,0,0处有它们的轴 无论出口前他们的本地支点在哪里。