реализации в Unity..
Смарите, у GameObject есть position, который судя по документации - глобальная позиция объекта.
Как её сеттер реализован в условиях иерархических трансформов?
Насколько я понимаю, финальная матрица в итоге каждый кадр строиться из position/rotation/scale всех трансформов в иерархии.
Но я вижу только 2 реализации:
1) Когда собираем финальную матрицу, циклически обходим все трансформы (вверх по иерархии) и перемножаем локальные матрицы.
2) Вместо хранения локальных pos/rot/scale в нодах, сразу храним глобальные, и тогда циклически придётся пересчитывать их уже по иерархии вниз (в сеттерах).
Что я упускаю?
Зачем строить на каждом кадре матрицу, если она не изменялась?
Ну это не суть важно, сделаем допущение что они все изменяются каждрый кадр.
Делаем обход вниз по иерархии, матрицы складываем в стек, считаем значение результирующей матрицы на вершине стека - это будет матрица объекта.
Можно посмотреть здесь Computer graphics programming in OpenGL with C++ (2019, Mercury Learning and Information), раздел 4.8 Matrix Stack
Хмм, пасиба, гляну.
Матрикс стэк же выплили вместе с FFP
Это наверное лучше знают те, кто работает с Unity, есть чаты на тему Unity, предлагаю там поспрашивать
Если есть дерево матриц, то его придется обходить. Единственная оптимизация не перерасчитывать его целиком, а только те ноды, что поменялись.
Это понятно, вопрос как с этим деревом сделать сеттинг глобальных координат на подобии того, как это сделано в Unity. Я вот вижу только 1 вариант - в нодах хранить не локальные данные для ноды, а глобальные. А при изменении позиции (например), брать и пересчитывать позиции всех её (ноды) детей. Т.е. очевидным плюсом будет как раз отсутствие необходимости обходить дерево вверх, при сборке матрицы. Очевидным минусом, O(n) уже будет на сеттере позиции. А вот альтернатива как я уже сказал - мне видится в том, чтобы всё таки хранить локальные данные для нод, а при сборки матрицы обходить дерево. Что на самом деле мне кажется даже более правильным. Но тогда не понятно как в принципе сеттить глобальную позицию. Но это я ещё про стек матриц не почитал, мб что-то прям совсем лобовое упускаю..
Чтобы выиграть максимум перфа лучше уйти от такой организации сцены
Глобальную позицию можно всегда поставить умножив вектор на обратную матрицу трансформации родителя. Но зачем, обычно, если у нас элемент чей то ребёнок, то менять глобальную позицию не имеет смысла
В целом я согласен, но мне кажется такое представление тупо удобнее с какой-то человеческой точки зрения. Типа если хочешь что-то делать с позицией в update'е, вот тебе позиция - делай. С локальной вдруг возникают вопросы - а относительно чего оно там? а не поменяется ли оно в будущем? и тд и тп Не знаю даже, как будто интуитивно понятнее.
Обсуждают сегодня