2014-05-28 2 views
1

У меня есть BufferGeometry, которая имеет много лиц, которые окрашены. При попытке применения KDTree к позициям BufferGeometry сKDTree Искажение геометрии буфера

new THREE.TypedArrayUtils.Kdtree(bufferGeometry.attributes.position.array, distanceFunction, 3);

я получаю мою геометрию искажены к этому: enter image description here

Когда это должно быть так: enter image description here

ответ

0

THREE.TypedArrayUtils.Kdtree сортирует поставляемый массив на месте. Вы можете скопировать массив и посмотреть, работает ли он тогда.

new THREE.TypedArrayUtils.Kdtree(bufferGeometry.attributes.position.array.slice(0), distanceFunction, 3); 

Обратите внимание на .slice(0);

+0

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

0

Вместо subarray(0), я обнаружил, что вы должны были инициализировать новый Float32Array, а затем установить эту переменную в массив вашей другой переменной.

var newArray = new Float32Array(bufferGeometry.attributes.position.array.length); 
newArray.set(bufferGeometry.attributes.position.array); 
+0

Да, kdtree разработан для высокой производительности. Поэтому он работает на тех позициях, которые вы ему предоставляете, делая все на месте. Если вы этого не хотите (а у вас нет, так как это сортирует вашу геометрию ^^), вы можете просто скопировать ее заранее. – Doidel

+1

Subarray не создает новый массив, он создает только массив с определенными границами – Doidel

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