3

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

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

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

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

4

4 回答 4

3

这是将变换控制设置为对象中心的代码:

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);
        });
    });
于 2018-09-11T18:01:40.317 回答
2

Try this, then read position(). I had the same issue, got an answer here. (geom is your Meshes geometry.)

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);
于 2013-01-24T12:57:39.080 回答
2

位置是相对于父级的

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

于 2013-01-24T04:03:07.993 回答
1

这是因为 obj 文件中的所有对象的轴心点都位于 World 0,0,0,无论它们在导出之前的本地轴心点在哪里。

于 2017-10-30T12:29:54.910 回答