Вращение узла модели цезия искажает модель
Я тестирую вращение узлов простой модели (из файла .glb) с использованием Resium/Cesium, и хотя оно хорошо работает с сторонней моделью, это не работает, когда я пробую это на своей собственной модели. Я не знаю, почему.
Модель представляет собой простое здание с небольшой коробкой наверху. Поле вверху должно иметь возможность вращаться вдоль оси Z (высота). Вот и все. Вместо этого Цезий искажает модель:
Модель в Блендере:
Как это отображается (правильно) в Цезии перед попыткой повернуть верхнюю коробку (игнорируйте все дополнительные строки)
Как это выглядит (неправильно) в цезии после попытки повернуть его вокруг оси высоты:
Код вращения в Cesium (я его не писал, он хорошо работает для имеющихся у меня сторонних моделей):
const rotateNode = (
node: any,
angleRad: number // radians
) => {
const matrix4 = node.matrix
const rotation = Cesium.Matrix3.fromRotationY(angleRad)
node.matrix = Cesium.Matrix4.multiplyByMatrix3(
matrix4,
rotation,
node.matrix
)
}
Еще одна странность заключается в том, что если я попытаюсь повернуть здание НИЖЕ верхнего ящика, оно будет вращаться правильно, пока все его вертикальные грани имеют одинаковый размер. Если я это изменю, перекос произойдет и в самом здании.
Есть идеи, что не так с моделью?
1 ответ
Я рискну здесь и предположу, что меньший верхний блок является «потомком» большего блока внизу, и, кроме того, к большему блоку внизу применено некое неравномерное масштабирование.
Если это так, вы можете обойти эту проблему в Blender, выбрав родительское поле большего размера и нажав «Объект» -> «Применить» -> «Масштаб».
Происходит то, что преобразования вышли из строя. В glTF, когда родительский узел имеет неравномерное масштабирование, а затем дочерний узел содержит некоторое вращение, умножение этих преобразований вместе приводит к неразложимой матрице. Это приводит к неправильному сдвигу или растяжению геометрии.
Некоторое время назад я описал это как проблему экспорта glTF-Blender-IO#1083. Но на самом деле это не ошибка в экспортере, а связана с тем, что glTF использует гораздо более простые, чем в Blender, правила того, как родительские узлы связаны со своими дочерними узлами (например, в glTF нет всей «обратной родительской» функции Blender).
Итак, на данный момент правило такое: если вы хотите повернуть детей, не применяйте неравномерное масштабирование к родителям.