2

在 Three.js 中加载 .obj 模型后,我无法找到顶点数据。需要顶点数据来应用此答案所建议的碰撞检测

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数据转换为顶点,但下面的代码不起作用,这个答案正确地指出了问题,但我无法用它来解决问题:

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
4

1 回答 1

4

geometry.attributes.position.array 是顶点。每三个值组成一个顶点。您还需要查看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将点转换为世界空间。

于 2020-01-28T17:27:09.537 回答