0

我正在使用THREE.OBJLoader将 3D 模型加载到我的场景中。它工作正常。

但是,将其添加到场景后,我需要将其缩放 10,然后检索其顶点位置。

我知道这THREE.OBJLoader给了我一个BufferGeometry,并且我知道如何使用position属性访问它的顶点。

我的问题是:Float32Array无论是在将网格添加到场景之前还是之后,在缩放网格后存储这些顶点似乎都没有更新。

在从加载程序中获取网格后,我使用此代码段来缩放网格:

myMesh = new THREE.Mesh(loadedMesh.geometry, new THREE.MeshBasicMaterial({color: 0xff0000}));
myMesh.scale.set(10, 10, 10);

然后我使用以下方法获取顶点:

var myMeshVertices = myMesh.geometry.attributes.position.array;

这样做,我的网格被添加到具有适当(缩放)尺寸的场景中,但它BufferGeometry不想更新顶点值。

我做了很多涉及myMesh.geometry.attributes.position.needsUpdate = true;or的测试myMesh.updateMatrix();,我已经看到了很多关于这个主题的 SO 问题(这里这里),但我找不到解决方案......

如果我在这里误解了什么,你能告诉我吗?(请记住,我刚开始使用 Three.js 和 WebGL,所以我肯定缺乏这方面的知识)。

4

1 回答 1

2

以下应该可以解决问题:

myMesh.geometry.scale( 10, 10, 10 );

缩放 的实例Object3D及其子类意味着您将缩放应用于其内部matrix,因此对其worldMatrix. 该矩阵稍后在顶点着色器中用于转换您的顶点。如果您需要在 CPU 端进行转换,请使用BufferGeometry.

于 2018-06-24T16:12:52.217 回答