3

OBJLoaderを介していくつかのオブジェクトをロードしました。ロードされたオブジェクトには、1つの親と複数の子が含まれています。次に、Raycasterを適用して、クリックされた子を見つけます。

次に、子オブジェクトの位置を更新したいのですが、すべての子の初期位置がゼロになります。

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

しかし、私のシーンではすべてうまく見えます。また、クリックしたオブジェクトを削除すると、実際にはシーンから削除されます。私は彼らの位置が(0,0,0)であることができないいくつかの点を逃したと思います。どうすれば相対位置に到達できますか?

4

4 に答える 4

3

TransformControlをオブジェクトの中心に設定するためのコードは次のとおりです。

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

位置は親を基準にしています

位置に親の変換を掛けて、ワールドスペース座標を取得します(それが目的の場合)

于 2013-01-24T04:03:07.993 に答える
2

これを試してから、position()を読んでください。私は同じ問題を抱えていました、ここで答えを得ました。(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);
于 2013-01-24T12:57:39.080 に答える
1

これは、エクスポートする前にローカルピボットがどこにあったかに関係なく、objファイル内のすべてのオブジェクトのピボットがワールド0,0,0にあるためです。

于 2017-10-30T12:29:54.910 に答える