Three.js如何获得网格的位置?

时间:2013-01-08 09:15:57

标签: javascript three.js

使用下面的代码,网格的位置将返回(0, 0, 0)但不是。那么渲染过程后计算的positioın向量是什么?

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是网址

该网站是土耳其语,所以我将翻译UI项目

在网站上有“Dosya”菜单项 选择菜单项并选择“ProjeAç” 出现一个对话框 在该对话框中选择MUTFAK_1 场景会出现 在那个场景中,每个网格位置都是(0,0,0) 是可能的:))

5 个答案:

答案 0 :(得分:23)

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()

答案 1 :(得分:11)

要查找世界空间中几何体质心的位置,请尝试以下方法:

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

答案 2 :(得分: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);

现在我们有几何质心......

更新 根据{{​​3}},.addSelf在r55之后已重命名为.add

答案 3 :(得分:2)

alert(objMesh.matrixWorld.getPosition().x + ',' + objMesh.matrixWorld.getPosition().y + ',' + objMesh.matrixWorld.getPosition().z);

答案 4 :(得分:0)

根据this post,网格的重心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;
}