我使用objloader加载多个对象。我试图移动一个对象,需要有更新的顶点位置。在加载对象时,我将buffergeometry转换为geometry并运行一些函数。我检查了一些样本,都更新了buffergeometry的顶点。我是否需要将其转换回buffergeometry ?我需要有实时的位置,而移动计算一些其他函数,所以我不喜欢继续从缓冲区转换到几何,反之亦然。
下面是一段代码:
var tool= new THREE.OBJLoader();
tool.load( '../obj/tool.obj', function ( object ) {
var material = new THREE.MeshLambertMaterial({color:0xA0A0A0});
object.traverse( function ( child ) {
if ( child instanceof THREE.Mesh ) {
child.material = material;
Geometry = new THREE.Geometry().fromBufferGeometry(child.geometry);
}
console.log(Geometry.vertices[220]);
Geometry.position.x += 0.01;
Geometry.verticesNeedUpdate = true;
console.log(Geometry.vertices[220]);
另外,我检查了最新版本的迁移文档并签出了
OBJLoader
返回BufferGeometry
。你可以这样更新顶点位置:
geometry.attributes.position.setX( index, x );
geometry.attributes.position.setXYZ( index, x, y, z ); // alternate
geometry.attributes.position.needsUpdate = true; // only required if geometry previously-rendered
研究http://threejs.org/docs/参考/核心/BufferAttribute
可以转换为Geometry
。在您的情况下,在加载器回调中执行以下操作:
child.geometry = new THREE.Geometry().fromBufferGeometry( child.geometry );
然后使用以下模式更新顶点位置:
geometry.vertices[ 0 ].set( x, y, z );
geometry.verticesNeedUpdate = true;
只在几何体之前被渲染过的情况下设置needsUpdate
标志。
three.js r.71