Я импортирую модель glTF с двумя сетками, используя
<a-entity gltf='#sofa'>
Предположим, что софа asset-item
указывает на ресурс. Я пытаюсь написать компонент, который изменит размер модели и перецентрирует ее при необходимости. Я смог успешно сделать это, используя
this.el.addEventListener("model-loaded", function(e) {
var model = e.detail.model;
model.traverse(function(o) {
if (o instanceof THREE.Mesh) {
o.geometry.center();
o.geometry.computeBoundingBox();
var bBox = o.geometry.boundingBox;
d = bBox.max.z - bBox.min.z;
w = bBox.max.x - bBox.min.x;
h = bBox.max.y - bBox.min.y;
switch(axis) {
case 'x':
scale = sizeto / w;
break;
case 'y':
scale = sizeto / h;
break;
case 'z':
scale = sizeto / d;
break;
default:
break;
}
}
}
el.setAttribute('scale', scale + ' ' + scale + ' ' + scale);
});
Свойства компонента включают в себя указание axis
viz x, y или z, размер которого изменяется, и значение sizeto
. Это хорошо работает для моделей с одной сеткой.
Для моделей с несколькими сетками я даже пытался указать основную сетку (предполагая, что одна из них важна), и дал axis
и sizeto
и применил ее ко всему элементу. Это тоже работает.
Случай, который я не смог обработать, - это когда я хочу, чтобы вся модель была перецентрирована или источник изменился, скажем, в центр получившейся модели или имел начало координат 0 0 0
.
Есть ли другой способ, кроме geometry.center()
, который можно использовать для повторного центрирования всей модели? Спасибо