在 Three.js 中加载 .obj 模型后,我无法找到顶点数据。如 this answer 所建议,应用碰撞检测需要顶点数据。
var loader = new THREE.OBJLoader();
loader.load('models/wall.obj', function ( object ) {
object.traverse( function ( node ) {
if ( node.isMesh ) {
console.log(node);
}
});
scene.add( object );
});
在网格中有geometry.attributes.position.array
,但我无法在对象中的任何位置找到“顶点”。
现在尝试将 position.array
数据转换为顶点,但下面的代码不起作用,this answer正确指出了问题,但我无法使用它来解决问题:
var tempVertex = new THREE.Vector3();
// set tempVertex based on information from mesh.geometry.attributes.position
mesh.localToWorld(tempVertex);
// tempVertex is converted from local coordinates into world coordinates,
// which is its "after mesh transformation" position
最佳答案
geometry.attributes.position.array
IS 顶点。每三个值组成一个顶点。您还需要查看 index
属性 (geometry.index
),因为它是 position
数组中的索引列表,定义构成形状的顶点。对于定义为单个三角形的Mesh
,每三个索引组成一个三角形。 (三带数据略有不同,但通过索引引用顶点值的概念是相同的。)
您也可以使用属性便利函数:
这些函数考虑了索引。因此,如果您想要第一个三角形的第一个顶点(索引 = 0):
let pos = geometry.attributes.position;
let vertex = new THREE.Vector3( pos.getX(0), pos.getY(0), pos.getZ(0) );
这相当于:
let pos = geometry.attributes.position.array;
let idx = geometry.index.array;
let size = geometry.attributes.position.itemSize;
let vertex = new THREE.Vector3( pos[(idx[0] * size) + 0], pos[(idx[0] * size) + 1], pos[(idx[0] * size) + 2] );
一旦有了顶点,就可以使用mesh.localToWorld
将点转换为世界空间。
关于three.js - 如何在Three.JS中获取obj模型对象的顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59949791/