three.js - 如何在Three.JS中获取obj模型对象的顶点?

标签 three.js vertices wavefront objloader

在 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/

相关文章:

javascript - CocoonJS + Three.js webGLRenderTarget 无声死亡

javascript - 使用 ThreeJS 将相机朝它所面对的方向移动

opengl - 从顶点数据中获取像素法线

java - OBJ 加载 - 奇怪的法线/uv

c++ - 了解通过 ASSIMP 加载 OBJ

javascript - Three.js 太空游戏相机控制

javascript - 与 Three.js 类似的构造函数

c++ - 存储顶点 DirectX C++

java - 从图中的文本文件读取节点数

c++ - 如何根据 Wavefront (.obj) 文件中给定的纹理索引对纹理位置进行排序?