three.js applyMatrix在比例结果导致错误

时间:2015-10-26 18:18:50

标签: javascript three.js

问题: 我希望在缩放后更新网格上的顶点位置。我这样做是因为我需要计算网格的体积。我正在创建一个克隆网格来执行此操作,因为我需要在原始网格中保持比例为活动参数。

我在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的更新?

1 个答案:

答案 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));

这样做有额外的好处,可以使用我迄今为止所抛出的任何几何类型:挤出,导入网格,基元......