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

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

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

Сообщений: 3260


Просмотр профиля
« : Май 09, 2012, 20:44 »

Решил я тут вспомнить 3д графику немного. Сел писать просмотрщик изображений с анимациями. Анимации делаю паинтером в 3д - к примеру поворот изображения вбок анимирован вращением по оси Z, зеркальное отражение - разворотом вокруг своей оси. Сейчас алгоритм такой - есть 2 картинки - исходная и отображаемая. При выполнении действия, скажем отражения, исходное изображение сразу переворачивается; при этом запускается анимация, которая поворачивает отображаемое изображение по определенной оси. При завершении анимации, отображаемое изображение заменяется на исходное, и углы поворота сбрасываются. Таким образом, если анимации выполняются строго последовательно, всё хорошо.
Тк анимации выполняются быстро, так всегда и выходит (я не успеваю нажать 2 шортката так быстро).
Однако, если анимашкам делать долгое время, то возникает "стандартная" проблема 3д поворотов - то, что порядок перемножения матриц имеет значение в 3х мерном пространстве. К примеру - если развернуть изображение по вертикали на 180 градусов, ось Z меняет направление на противоположное и разворот "влево" начинает идти вправо.
Возможно ли решить проблему - чтобы поворот выполнялся независимо от других осей?
Или единственное решение - выполнять анимации последовательно?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Май 09, 2012, 21:13 »

Зеркальное отражение тоже описывается матрицей, но оно не равно повороту(ам)

Да, такая проблема есть, если вращение задается углами Эйлера, то должен быть определен порядок поворотов, напр ZXY. Можете крутить вокруг мировых осей - в одних случаях это удобно, в др. нет   
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Май 10, 2012, 08:33 »

А если попробовать так - есть список текущих анимаций, каждая анимашка меняет угол одной оси. И матрицы поворота применять в порядке, обратном порядку анимаций в списке?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 10, 2012, 10:12 »

А если попробовать так - есть список текущих анимаций, каждая анимашка меняет угол одной оси. И матрицы поворота применять в порядке, обратном порядку анимаций в списке?
Так просто меняется порядок поворотов, напр было ZXY, стало YXZ. Этот порядок так или иначе должен быть определен. Неясно чего Вы хотите добиться  Улыбающийся
Записан
V1KT0P
Гость
« Ответ #4 : Май 10, 2012, 10:14 »

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

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Май 10, 2012, 18:39 »

Да, идея оказалось верной - все работает.
Код:
    QTransform matrix;
    matrix.translate(center.x(), center.y());

    for (int i = d->runningAnimations.count() - 1; i >= 0; i--) {
        AxisAnimation *animation = d->runningAnimations.at(i);
        matrix.rotate(animation->angle(), animation->axis());
    }

    matrix.translate(-center.x(), -center.y());
    p.setTransform(matrix);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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