Three.js r68 - Невозможно получить центроиды геометрии с помощью OBJMTLLoader

Я довольно давно использую старую версию Three.js, поэтому решил обновить ее до последней (r68). Я знал, что столкнусь с некоторыми проблемами, но не ожидал удаления свойств geometry.computeCentroids () и .centroid.

Я загружаю модели с помощью библиотеки OBJMTLLoader. Проблема в том, что, поскольку у него больше нет метода .computeCentroids (), у меня нет возможности их получить. Я пытался вычислить их другими методами, но безуспешно:

Я также пробовал использовать методы .localToWorld (point), но они тоже не работают. Он всегда возвращает (0,0,0).

На данный момент, когда я нажимаю на сетку, я вычисляю (или пытаюсь вычислить) ее центроид с помощью:

 if (mesh.centroid === undefined) {
    mesh.centroid = new THREE.Vector3();
    mesh.centroid = mesh.geometry.center();
    console.log(mesh.centroid); }

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

//desperate try to find different values for centroids
object.updateMatrix();
scene.updateMatrix();
object.updateMatrixWorld();
scene.updateMatrixWorld();

Что еще более странно, так это то, что центроиды, которые я пытаюсь вычислить, несовместимы. Он всегда показывает одни и те же векторы в console.log (), независимо от того, в каком порядке я щелкаю сетки.

THREE.Vector3 {x: 158.89799999999997, y: -4.115949999999998, z: 67.75310000000002, constructor: function, set: function…}
THREE.Vector3 {x: 0.000005004882780212938, y: 0.16375010757446518, z: 0.0000024658203301441972, constructor: function, set: function…}
THREE.Vector3 {x: -1.7053025658242404e-13, y: -0.0818749484539012, z: 1.1368683772161603e-13, constructor: function, set: function…}

Мне было интересно, была ли у кого-то подобная проблема с этим. Я не пробовал предыдущие версии three.js, так как очень хочу перейти на последнюю версию и сохранить ее согласованность.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Забыл упомянуть важную деталь. Я хочу, чтобы центроид был в МИРОВЫХ координатах.

После использования метода mrdoob я смог получить центроид. Я всегда получаю одно и то же значение для каждой сетки, потому что, хотя я использую .calculateBoundingBoxes () для каждой сетки, эти границы относятся к основному родительскому объекту. Каждой геометрии назначены все вершины объекта, и я предполагаю, что ограничивающие прямоугольники рассчитываются в соответствии с этими вершинами, и поэтому я получаю одинаковые значения для каждой геометрии.


person VitorOliveira    schedule 12.08.2014    source источник
comment
Может быть, это связано с тем, что я только что создал функцию computeCentroids () для вычисления центроидов лиц gist.github.com/Delvarda09e09e08e08e08e08e6, чтобы заменить функциональность, удаленную в более новых трех сборках.   -  person Andy Ray    schedule 05.07.2016


Ответы (1)


Если вы хотите вычислить центроид всей геометрии, вам нужен этот код:

geometry.computeBoundingBox();

var centroid = new THREE.Vector3();
centroid.addVectors( geometry.boundingBox.min, geometry.boundingBox.max );
centroid.multiplyScalar( - 0.5 );

centroid.applyMatrix4( mesh.matrixWorld );
person mrdoob    schedule 12.08.2014
comment
Я пробовал использовать описанный выше метод, но получаю одинаковые центроиды для каждого объекта: THREE.Vector3 {x: 158.89799999999997, y: -3.9521999999999977, z: 67.75310000000002, constructor: function, set: function…} Я только что отредактировал свой вопрос, потому что забыл важную деталь: я хочу использовать мировые координаты вычисленного центроида. - person VitorOliveira; 13.08.2014
comment
Обновленный ответ с битом мирового пространства. - person mrdoob; 13.08.2014
comment
Спасибо за помощь! Я обнаружил, что проблема с одинаковыми значениями может быть связана с самим загрузчиком, но теперь у меня есть мировые координаты всего объекта. - person VitorOliveira; 13.08.2014
comment
Пришлось сменить centroid.multiplyScalar( - 0.5 ); на centroid.multiplyScalar( 0.5 );. OBJLoader r73 - person 2pha; 12.01.2016