Russian Qt Forum
Ноябрь 22, 2024, 07:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Локальный путь  (Прочитано 5887 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 14, 2019, 08:35 »

Добрый день

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

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

Спасибо
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Август 14, 2019, 15:05 »

Нужно локальную точку умножить на матрицу обратную m2, а дальше по вышеприведенной схеме.
Или сразу использовать матрицу M = m2-1 x m1 x m2 x m3
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 14, 2019, 15:39 »

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

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

Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #3 : Август 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) любую другую точку.
Можно делать другие предположения, например, учитывать вращение объекта вдоль касательной к траектории, тогда измениться вращательная часть матрицы.
« Последнее редактирование: Август 15, 2019, 08:15 от ssoft » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #4 : Август 15, 2019, 08:13 »

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 15, 2019, 09:05 »

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

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

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

Спасибо за участие  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 22.