Вращение узла модели цезия искажает модель

Я тестирую вращение узлов простой модели (из файла .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).

Итак, на данный момент правило такое: если вы хотите повернуть детей, не применяйте неравномерное масштабирование к родителям.

Другие вопросы по тегам