THREE.OBJLoader-缩放网格和BufferGeometry顶点

时间:2018-06-24 16:01:07

标签: javascript three.js buffer-geometry objloader

我正在使用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;myMesh.updateMatrix();的测试,并且我已经看到很多有关该主题的问题(herehere),但是我找不到解决方案...

你能告诉我我是否误解了吗? (请记住,我刚开始是从Three.js和WebGL开始的,所以我当然对此缺乏了解。)

1 个答案:

答案 0 :(得分:2)

以下应该可以解决问题:

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

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