2015-10-26 5 views
0

Проблема: Я ищу, чтобы обновить позиции вершин на сетке после масштабирования. Я делаю это, потому что мне нужно рассчитать объем сетки. Я создаю клонированную сетку, чтобы сделать это, потому что мне нужно сохранить масштаб активного параметра в исходной сетке.three.js applyMatrix после результатов масштабирования

Я использовал ответ на How to update vertices geometry after rotate or move object

который работал хорошо с Three.js релиз .70, но сломалась на выпуск 0,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 есть:

Uncaught TypeError: Не удается прочитать свойство 'setFromPoints' неопределенного THREE.Geometry.computeBoundingBox @ lib.min.js: 3THREE.Geometry.applyMatrix

То, что я пробовал: я попытался исследовать и изолировать проблему в Geometry.js и Box3.js, а также понять программный поток, чтобы понять, почему «this.boundBox» не определен, но я не нашел проблемы.

Вопрос: Правильно ли синтаксис? Была ли обновлена ​​информация о трёх.js в этой области?

+0

Используйте three.js, а не three.min.js, для разработки. Используйте текущую версию three.js. Попытайтесь отследить проблему. Опубликуйте jsfiddle, если у вас есть проблемы. – WestLangley

+0

Хорошо, я сделал это. Я отслеживал проблему дальше до this.mesh.geometry.clone(), которая, кажется, копирует только faceVertexUvs, лица, вершины и прототип. Он не копирует свойства по умолчанию объекта геометрии, как указано в Geometry.js? Нет имени, типа, id и т. Д., Поэтому boundingBox не определен, что вызывает видимую ошибку в Geometry.applyMatrix. Есть ли другой метод клонирования, который я должен использовать? – Radio

+0

@WestLangley Клон относится к типу extrudeGeometry. Я не уверен, что это часть проблемы. – Radio

ответ

0

Ответ оказался таким, что extrudeGeometry не содержит тех же свойств, что и обычная геометрия, и поэтому работа над ним не работает, поскольку данные отсутствуют. Ответ заключается в том, чтобы преобразовать буферную геометрию в правильную геометрию, прежде чем пытаться работать с ней как регулярная геометрия. Я понимаю преимущества использования буферов, но в этом случае я могу создать геометрию для измерений и уничтожить ее, когда получаю результат.

Так, а не «клон» геометрии, как показано на мой вопрос, я переключаюсь на создание конкретного типа геометрии из экземпляра буфера:

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

Это имеет дополнительное преимущество в работе с любым типом геометрии у меня есть брошенные на нем до сих пор: экструзии, импортированные сетки, примитивы ...

Смежные вопросы