Как я могу получить размер меша, который был масштабирован костью в three.js? - PullRequest
0 голосов
/ 22 сентября 2018

Мой проект - это небольшая веб-игра на javascript с three.js.

Я использую GLTFLoader для импорта файла GLTF с анимацией в мой проект.Модель загружена, и я могу воспроизвести все анимации.Моя цель - сделать сетевой трафик как можно меньше.Вот почему я хочу импортировать только несколько моделей GLTF в качестве базовых моделей и изменить их внешний вид на стороне клиента с помощью three.js.Масштабируя определенные кости модели, я могу сделать ее высотой, не мешая анимации скелета.

Единственная проблема:

Если я изменю размер модели,масштабируя некоторые кости, размер модели изменяется по всей оси Y.Положительный и отрицательный.

Например:

Если я помещу модель «человека» в плоскость, а затем масштабирую модель путем масштабирования кости, ножки модели перемещаются ниже плоскостииз-за масштабирования.Вот почему мне нужно знать точную высоту или размер моей модели до и после того, как я изменил размер путем масштабирования кости.Таким образом, я мог вычислить, как далеко мне нужно подтолкнуть модель над плоскостью.

Я попытался

mesh.geometry.computeBoundingBox()

, и тогда я получу размер ограничивающего прямоугольника, но это просто даст мне размернеизменной геометрии моей модели.

Я также попытался создать новый объект Box3 и сделать его такого же размера, как моя измененная модель, используя:

new Box3().setFromObject(mesh);

Но это также просто даетмне неизменный размер геометрии.

Итак, как мне получить размер меша, который был масштабирован костью за три.js?Или есть другой способ решить мою проблему?

Ждем ваших предложений.

1 Ответ

0 голосов
/ 23 сентября 2018

Скиннинг (преобразование вершин, вызванное костями) применяется на графическом процессоре по соображениям производительности, и позиции вершин никогда не считываются обратно в память приложения.В результате, такие методы, как geometry.computeBoundingBox(), mesh.scale и лучевое вещание, не будут учитывать скиннинг.

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

var bone = model.getObjectByName('MyScalingBone');
console.log(bone.scale);
...