Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Igors от Август 14, 2019, 08:35



Название: Локальный путь
Отправлено: Igors от Август 14, 2019, 08:35
Добрый день

Есть путь который объект проходит кадр за кадром. На каждом кадре вычисляется матрица
Цитировать
M = m1 x m2 x m3
Матрицы m1 и m3 фиксированы, а матрица m2 меняется на каждом кадре. Просто множим точку (0, 0, 0) на матрицу M и получаем текущую позицию объекта на данном кадре. Все работает.

Теперь матрицы m2 нет, зато есть локальный путь - контейнер точек, причем известно что каждая была получена умножением точки (0, 0, 0) на свою матрицу m2 (ту самую что забрали). Как теперь нарисовать точки пути?

Спасибо


Название: Re: Локальный путь
Отправлено: ssoft от Август 14, 2019, 15:05
Нужно локальную точку умножить на матрицу обратную m2, а дальше по вышеприведенной схеме.
Или сразу использовать матрицу M = m2-1 x m1 x m2 x m3


Название: Re: Локальный путь
Отправлено: Igors от Август 14, 2019, 15:39
Нужно локальную точку умножить на матрицу обратную m2, а дальше по вышеприведенной схеме.
Или сразу использовать матрицу M = m2-1 x m1 x m2 x m3
Так нету никакой m2, вместо нее теперь массив точек. А множить на обратную "в момент создания/получения точек" (даже если бы он был известен) бесполезно - заведомо получим нули.

Больше подробностей: m2 - это по сути то что вводит юзверь создавая путь объекта во времени. Но есть еще "пре" и "пост" преобразования. Напр объект прилинкован к другому - нужно  учесть сдвиг и/или поворот/масштаб парента, а чтобы объект риcовать - нужна камера у которой конечно своя матрица.  Отсюда m1 и m3. Нужно рисовать локальный путь напр загруженный из файла (вместо того что вводит юзверь).



Название: Re: Локальный путь
Отправлено: ssoft от Август 15, 2019, 08:04
Знание о том, что точка имеет координаты (0, 0, 0) позволяет восстановить только 4-й столбец матрицы m2, при предположении, что других преобразований нет (поворота, масштаба и т.п.)

прямая матрица m2
Код:
| 1 0 0 x |
| 0 1 0 y |
| 0 0 1 z |
| 0 0 0 1 |

обратная матрица m2-1
Код:
| 1 0 0 -x |
| 0 1 0 -y |
| 0 0 1 -z |
| 0 0 0 1 |

Без предположений о виде матрицы правильно нарисовать точки не получится, так как существует бесконечное количество вариантов m2, чтобы получить из (0,0,0) любую другую точку.
Можно делать другие предположения, например, учитывать вращение объекта вдоль касательной к траектории, тогда измениться вращательная часть матрицы.


Название: Re: Локальный путь
Отправлено: ssoft от Август 15, 2019, 08:13
Больше подробностей: m2 - это по сути то что вводит юзверь создавая путь объекта во времени. Но есть еще "пре" и "пост" преобразования. Напр объект прилинкован к другому - нужно  учесть сдвиг и/или поворот/масштаб парента, а чтобы объект риcовать - нужна камера у которой конечно своя матрица.  Отсюда m1 и m3. Нужно рисовать локальный путь напр загруженный из файла (вместо того что вводит юзверь).

Для корректных трансформаций всегда хранят матрицы или кватернионы. Учет прилинковки требует пересчета трансформаций объекта по всей цепочке на каждом шаге отрисовки.


Название: Re: Локальный путь
Отправлено: Igors от Август 15, 2019, 09:05
Учет прилинковки требует пересчета трансформаций объекта по всей цепочке на каждом шаге отрисовки.
Так и делается когда меняется текущий кадр - выполняются все трансформации. Однако для отрисовки пути(ей) это в общем случае неприемлемо по затратам (кадров может быть тысячи и на каждом считать все трансформы). Поэтому путь рисуется для текущего положения парента(ов) - отсюда фиксированные матрицы m1 и m3.

Более того, даже сканирование пути одного (данного) объекта - удовольствие дорогое. Отсюда собсно и эта задача - сохранить локальный путь и потом его быстро рисовать.

Я тоже ничего не нашел, похоже в общем виде решения нет, избавиться от пре-матрицы m1 никак не удается. Ну можно все транспонировать и записать в обратном порядке (типа сменить мажор) - а толку? Теперь m1 с др стороны, проблемы все те же. Попечатал эту злополучную m1 - похоже это матрица поворота (убедиться точно не удалось, она собирается из многих). Ну и выкинул ее, для пути множу точки контейнера на m3 - так работает (пока)

Спасибо за участие  :)