使用下面的代码,网格的位置将返回(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) 是可能的:))
答案 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;
}