Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Авварон от Май 09, 2012, 20:44



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


Название: Re: Глупый вопрос по трансформациям
Отправлено: Igors от Май 09, 2012, 21:13
Зеркальное отражение тоже описывается матрицей, но оно не равно повороту(ам)

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


Название: Re: Глупый вопрос по трансформациям
Отправлено: Авварон от Май 10, 2012, 08:33
А если попробовать так - есть список текущих анимаций, каждая анимашка меняет угол одной оси. И матрицы поворота применять в порядке, обратном порядку анимаций в списке?


Название: Re: Глупый вопрос по трансформациям
Отправлено: Igors от Май 10, 2012, 10:12
А если попробовать так - есть список текущих анимаций, каждая анимашка меняет угол одной оси. И матрицы поворота применять в порядке, обратном порядку анимаций в списке?
Так просто меняется порядок поворотов, напр было ZXY, стало YXZ. Этот порядок так или иначе должен быть определен. Неясно чего Вы хотите добиться  :)


Название: Re: Глупый вопрос по трансформациям
Отправлено: V1KT0P от Май 10, 2012, 10:14
Лучшеб на геймдеве спросил, там спецов по трехмерной графике навалом.


Название: Re: Глупый вопрос по трансформациям
Отправлено: Авварон от Май 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);