我通过OBJLoader加载了一些对象,加载的对象包含一个父对象和多个子对象;然后我申请Raycaster并找到被点击的孩子。
然后我想更新子对象的位置,但所有孩子的初始位置都为零。
var intersect = intersects[0].object;
intersect.position.y = intersect.position.y + 5; // 0 + 5
但在我的场景中看起来都很好。此外,如果我删除被点击的对象,实际上它是从场景中删除。我想我错过了一些观点,他们的位置不能(0,0,0)。我怎样才能达到他们的相对位置?
答案 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处有它们的轴 无论出口前他们的本地支点在哪里。