К таким особенностям можно отнести порядок перемножения матриц, а также помещение матриц в матричный стек. Рассмотрим их более подробно.
Порядок перемножения матриц
При перемножении матриц либо при вызове команд, таких как glScale*, glTranslate*, glRotate* или glMultMatrix* (которые перемножают текущую матрицу на заданную, см. Видовые преобразования ) следует учитывать порядок вызова команд или порядок перемножения матриц, если вы самостоятельно перемножаете матрицы. Таким образом, если нам, например, нужно, переместить и повернуть куб с центром, лежащим в центре координат, то выполненные вращение и повороты в разных последовательностях дадут совершенно разные результаты, что вполне логично.
Если мы повернем куб на 45 градусов вокруг оси Y, то он повернется вокруг своей оси, так как центр куба и центр координат совпадают. Если мы теперь переместим куб на 3 единицы по X, то он соответственно переместится по X вправо. В результате мы получим повернутый, а затем перемещенный куб.
Если мы (наоборот) переместим куб, а затем повернем его, то он уже не будет повернут вокруг собственного центра, а повернется вокруг центра координат, так как он был сначала перемещен. Разница очевидна.
Помещение матриц в матричный стек
Если порядок перемножения матриц влияет на позиционирование сцены, то матричный стек влияет на порядок перемножения матриц. Дело в том, что все матрицы, заданные пользователем с помощью стандартных команд, до начала вычислений OpenGL помещает в специальный стек. Это значит, что достаются, а затем перемножаются они совершенно в обратной последовательности. Таким образом, если нам нужно выполнить масштабирование, перенос, а затем вращение сцены, то они будут выполнены совершенно наоборот. Сначала будет произведено вращение, затем перенос и наконец, масштабирование.
Следует учитывать эти особенности при построении сцен в OpenGL.
|