Господа движкостроители, а поясните мне тупому одну штуку по внутренней

реализации в Unity..
Смарите, у GameObject есть position, который судя по документации - глобальная позиция объекта.
Как её сеттер реализован в условиях иерархических трансформов?

Насколько я понимаю, финальная матрица в итоге каждый кадр строиться из position/rotation/scale всех трансформов в иерархии.
Но я вижу только 2 реализации:
1) Когда собираем финальную матрицу, циклически обходим все трансформы (вверх по иерархии) и перемножаем локальные матрицы.
2) Вместо хранения локальных pos/rot/scale в нодах, сразу храним глобальные, и тогда циклически придётся пересчитывать их уже по иерархии вниз (в сеттерах).

Что я упускаю?

12 ответов

23 просмотра

Зачем строить на каждом кадре матрицу, если она не изменялась?

ed-braed Автор вопроса
Skarn
Зачем строить на каждом кадре матрицу, если она не...

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

Делаем обход вниз по иерархии, матрицы складываем в стек, считаем значение результирующей матрицы на вершине стека - это будет матрица объекта.

Можно посмотреть здесь Computer graphics programming in OpenGL with C++ (2019, Mercury Learning and Information), раздел 4.8 Matrix Stack

ed-braed Автор вопроса
Artyom Vorobyov
Можно посмотреть здесь Computer graphics programmi...

Матрикс стэк же выплили вместе с FFP

Это наверное лучше знают те, кто работает с Unity, есть чаты на тему Unity, предлагаю там поспрашивать

Если есть дерево матриц, то его придется обходить. Единственная оптимизация не перерасчитывать его целиком, а только те ноды, что поменялись.

ed-braed Автор вопроса
Yan Mezhov
Если есть дерево матриц, то его придется обходить....

Это понятно, вопрос как с этим деревом сделать сеттинг глобальных координат на подобии того, как это сделано в Unity. Я вот вижу только 1 вариант - в нодах хранить не локальные данные для ноды, а глобальные. А при изменении позиции (например), брать и пересчитывать позиции всех её (ноды) детей. Т.е. очевидным плюсом будет как раз отсутствие необходимости обходить дерево вверх, при сборке матрицы. Очевидным минусом, O(n) уже будет на сеттере позиции. А вот альтернатива как я уже сказал - мне видится в том, чтобы всё таки хранить локальные данные для нод, а при сборки матрицы обходить дерево. Что на самом деле мне кажется даже более правильным. Но тогда не понятно как в принципе сеттить глобальную позицию. Но это я ещё про стек матриц не почитал, мб что-то прям совсем лобовое упускаю..

ed braed
Это понятно, вопрос как с этим деревом сделать сет...

Чтобы выиграть максимум перфа лучше уйти от такой организации сцены

Глобальную позицию можно всегда поставить умножив вектор на обратную матрицу трансформации родителя. Но зачем, обычно, если у нас элемент чей то ребёнок, то менять глобальную позицию не имеет смысла

ed-braed Автор вопроса
Alexander Potapov
Глобальную позицию можно всегда поставить умножив ...

В целом я согласен, но мне кажется такое представление тупо удобнее с какой-то человеческой точки зрения. Типа если хочешь что-то делать с позицией в update'е, вот тебе позиция - делай. С локальной вдруг возникают вопросы - а относительно чего оно там? а не поменяется ли оно в будущем? и тд и тп Не знаю даже, как будто интуитивно понятнее.

Похожие вопросы

Обсуждают сегодня

Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
А в каком формате фреймы? Сам формат сейчас придумываешь, или что-то готовое нужно распарсить?
Okhsunrog
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Карта сайта