8

以下のコードでは、メッシュの位置はとして返されますが、返され(0, 0, 0)ません。では、位置ベクトルはレンダリングプロセス後に計算されますか?

me.scene.add(objMesh); //me is a project class
objMesh.updateMatrixWorld(true);
alert(objMesh.position.x + ',' + objMesh.position.y + ',' + objMesh.position.z);

objMeshはobjfileから作成され、シーンに正しく追加され、重心は約(-8、3、0)ですが、objMeshの位置ベクトルは(0、0、0)です。最初に何かを自動計算する必要がありますか、それとも計算する必要がありますかメッシュのジオメトリ頂点から手動で?

http://81.214.75.32:8181/adminはURLです

サイトはトルコ語なので、UIアイテムを翻訳します

サイトには「Dosya」メニュー項目があり、メニュー項目を選択して「ProjeAç」を選択すると、そのダイアログにダイアログが表示されます。MUTFAK_1シーンを選択すると、そのシーンに表示されます。すべてのメッシュ位置は(0、0、0)です。 )。

4

5 に答える 5

28

object.position常にオブジェクトに対してローカルです。ワールドスペースでの位置を取得したい場合は、から取得する必要がありますobject.matrixWorld

これで試してください:

scene.add(objMesh);
scene.updateMatrixWorld(true);
var position = new THREE.Vector3();
position.getPositionFromMatrix( objMesh.matrixWorld );
alert(position.x + ',' + position.y + ',' + position.z);

r58


アップデート:

関数のgetPositionFromMatrix()名前はに変更されましたsetFromMatrixPosition()

于 2013-01-08T13:44:44.177 に答える
13

世界空間のどこにジオメトリの重心があるかを見つけるには、次のことを試してください。

objMesh.geometry.computeBoundingBox();

var boundingBox = objMesh.geometry.boundingBox;

var position = new THREE.Vector3();
position.subVectors( boundingBox.max, boundingBox.min );
position.multiplyScalar( 0.5 );
position.add( boundingBox.min );

position.applyMatrix4( objMesh.matrixWorld );

alert(position.x + ',' + position.y + ',' + position.z);

r58

于 2013-01-08T22:46:47.480 に答える
4

うん。mrdoobと話をした後、オブジェクトの位置が自分自身にローカルであることに気付きました。私の状況は、頂点を考慮してメッシュの中心点を見つけることでした。以下は、回答#447(https://github.com/mrdoob/three.js/issues/447)から取得した重心を取得するためのコードです。

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

これで、ジオメトリの図心ができました...

https://github.com/mrdoob/three.js/wiki/Migrationに従って更新し、r55以降に名前.addSelfが変更されました.add

于 2013-01-09T09:27:05.130 に答える
2
alert(objMesh.matrixWorld.getPosition().x + ',' + objMesh.matrixWorld.getPosition().y + ',' + objMesh.matrixWorld.getPosition().z);
于 2013-01-08T10:01:02.210 に答える
0

この投稿によると、メッシュの重心Cは次の式で求めることができます。

C = [すべての合計(A * R)]/[すべてのAの合計]
A=(面の面積* 2)
R=面の重心=面を構成する頂点の平均

これがthree.jsのコードです

function calculateCenterOfMass( mesh ){

    var centroid = new THREE.Vector3();

    // centroid = centroidNominator / centroidDenominator;
    var centroidNominator = new THREE.Vector3(); 
    var centroidDenominator = 0;

    for(var i = 0; i < mesh.geometry.faces.length; i++){

        var Pi = mesh.geometry.faces[i].a;
        var Qi = mesh.geometry.faces[i].b;
        var Ri = mesh.geometry.faces[i].c;

        var a = new THREE.Vector3(mesh.geometry.vertices[Pi].x, mesh.geometry.vertices[Pi].y, mesh.geometry.vertices[Pi].z);
        var b = new THREE.Vector3(mesh.geometry.vertices[Qi].x, mesh.geometry.vertices[Qi].y, mesh.geometry.vertices[Qi].z);
        var c = new THREE.Vector3(mesh.geometry.vertices[Ri].x, mesh.geometry.vertices[Ri].y, mesh.geometry.vertices[Ri].z);

        var ab = b.clone().sub(a);
        var ac = c.clone().sub(a);

        var cross = new THREE.Vector3();
        cross.crossVectors( ab, ac );

        var faceArea = cross.lengthSq() / 2;
        var faceCentroid = new THREE.Vector3( (a.x + b.x + c.x)/3, (a.y + b.y + c.y)/3, (a.z + b.z + c.z)/3 );

        if (!isNaN(faceArea)){
            centroidNominator.add(faceCentroid.multiplyScalar(faceArea));
            centroidDenominator += faceArea;
        }
    }


    centroid = centroidNominator.divideScalar(centroidDenominator);

    return centroid;
}
于 2016-02-12T11:47:58.220 に答える