Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Three.js如何获取网格的位置?_Javascript_Three.js - Fatal编程技术网

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

Javascript Three.js如何获取网格的位置?,javascript,three.js,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创建的,它被正确地添加到场景中,

使用下面的代码,网格的位置返回为
(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
是url

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

网站上有“Dosya”菜单项 打开菜单项并选择“Proje Aç” 此时会出现一个对话框 在该对话框中选择MUTFAK_1 场景将出现 在该场景中,每个网格位置都是(0,0,0)
是否可能:)

对象。位置始终是对象的局部位置。如果要获取世界空间中的位置,需要从
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()
要查找世界空间中几何体质心的位置,请尝试以下操作:

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是的。在和Doob先生交谈之后,我意识到,物体的位置是它们自身的局部位置。我的情况是在考虑顶点的情况下找到网格的中心点。下面是从答案#447()获取质心的代码

geom.centroid=new THREE.Vector3();
对于(var i=0,l=geom.vertices.length;i
现在我们有了几何体的质心

更新 根据,已将
.addSelf
重命名为
.add
在r55之后

根据可通过以下方式找到网格的重心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;
}
函数CalculateCenter质量(网格){
var centroid=新的3.Vector3();
//质心=质心命名器/质心分母;
var centroidNominator=新的3.Vector3();
var质心分母=0;
对于(变量i=0;i
请解释您的解决方案,不要只粘贴代码。不,我的朋友,这也会返回(0,0,0),我也尝试过objMesh.matrixWorld.getPosition()。没有人返回网格的正确位置。我正在把整个项目上传到服务器上。也许这会更清楚。杜布先生,这是我以前试过的。。。此代码还返回(0,0,0)。您能从上面的url查看应用程序吗?在帕奎特的地面上应该有一个长方体以供反射。场景的导入由FileManager.js完成。您将在第290行中看到在if块内部添加网格的代码。我无法获得任何网格的世界位置。我更新了项目以自动加载右侧窗格(“Nesne Ozellikleri”)中的场景,其中有“Yansima Merkez”文本框。这些值会改变立方体的位置。地平面大约在(-8,3,0)上,因此立方体必须位于这一点。那么问题一定是,要么几何体应用了偏移,要么您试图获得错误对象的位置。我确信这不是错误的对象。因为场景中的每个对象都返回0。我为每个网格创建自定义几何体,并为该几何体指定顶点。此顶点使对象位于场景中的相应位置。主要问题是,如果我们创建自定义几何体并向其添加顶点,然后使用此几何体创建网格,并在不设置任何位置的情况下将此网格添加到场景中,我们能获得此网格的真实位置吗?如果是,如何删除?r58:Matrix4的.multiplyVector 3()。改用vector.applyMatrix4(矩阵)或vector.applyProjection(矩阵)。r58的上述代码是什么?@mrdoob,请您解释一下上述步骤的含义。至少此步位。多重刻度(0.5)@rajkamal将某物乘以.5意味着得到它的一半。事实上,将任何东西乘以0到1之间的数字意味着得到它的百分比。5是50%,.85是85%,我很好奇你是否可以用
geom.boundingSphere.center
来代替?在这种情况下,这对我很有效。
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);
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;
}