问题: 我希望在缩放后更新网格上的顶点位置。我这样做是因为我需要计算网格的体积。我正在创建一个克隆网格来执行此操作,因为我需要在原始网格中保持比例为活动参数。
我在How to update vertices geometry after rotate or move object
使用了答案使用three.js发布.70时效果很好,但在发布.72
时已经破解我的代码:
var volumeClone = new THREE.Mesh (this.mesh.geometry.clone(), new THREE.MeshBasicMaterial( { color: 0xff0000 } ));
volumeClone.scale.z = heightScale;
volumeClone.updateMatrix();
volumeClone.geometry.applyMatrix( volumeClone.matrix );
volumeClone.matrix.identity();
volumeClone.geometry.verticesNeedUpdate = true;
volumeClone.scale.set( 1, 1, 1 );
console(calculateVolume(volumeClone));
结果:
在Chrome中:
未捕获的TypeError:无法读取未定义的属性'setFromPoints' THREE.Geometry.computeBoundingBox @ lib.min.js:3THREE.Geometry.applyMatrix
我尝试了什么: 我试图调查并隔离Geometry.js和Box3.js中的问题,并了解程序流程,以了解为什么“this.boundBox”未定义,但我没有发现问题。
问题: 语法是否正确?这个领域有没有对three.js的更新?
答案 0 :(得分:0)
答案结果是,expanddeGeometry不包含与常规几何体相同的属性,因此对其进行处理并不起作用,因为缺少细节。答案是在尝试将bufferGeometry用作常规几何体之前将bufferGeometry转换为常规几何体。我理解使用缓冲区的性能优势,但在这种情况下,我可以为测量创建几何体,并在得到结果时将其丢弃。
所以而不是"克隆"几何如我的问题所示,我转而从缓冲区实例创建特定类型Geometry:
var volumeClone = new THREE.Mesh (new THREE.Geometry().fromBufferGeometry( this.mesh.geometry._bufferGeometry ), new THREE.MeshBasicMaterial( { color: 0xff0000 } ));
volumeClone.scale.z = heightScale;
volumeClone.updateMatrix();
volumeClone.geometry.applyMatrix( volumeClone.matrix );
volumeClone.matrix.identity();
volumeClone.geometry.verticesNeedUpdate = true;
volumeClone.scale.set( 1, 1, 1 );
console(calculateVolume(volumeClone));
这样做有额外的好处,可以使用我迄今为止所抛出的任何几何类型:挤出,导入网格,基元......