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;
}