Уроки по OpenGL с сайта OGLDev


Урок 08 - Преобразования масштаба

Изменить масштаб очень просто. Цель этого преобразования увеличить или уменьшить размеры объекта. Это может пригодиться, если требуется добавить разнообразия, используя одну модель (например, большие и маленькие деревья, использующие одну и ту же модель) или если требуется сопоставить размеры модели с ее аналогом из реального мира. В данных случаях скорее всего потребуется одинаковое масштабирование во всех направлениях. Хотя, бывают случаи, когда требуется изменить размер только для одной оси, например, что бы модель стала "толще" или "тоньше".

Давайте же вычислим матрицу преобразований. Мы начнём с единичной матрицы и вспомним, что умножение ее на вектор возвратит исходный вектор без изменений, потому что каждая компонента вектора будет умножаться на '1'. Заметим, что ни один компонент не влияет на другие. Иначе говоря, изменив значение с '1' на любое другое, мы заставим объект увеличиваться, если число будет больше 1 и уменьшаться, если меньше.

Прямиком к коду!

World.m[0][0]=sinf(Scale); World.m[0][1]=0.0f;        World.m[0][2]=0.0f;        World.m[0][3]=0.0f;
World.m[1][0]=0.0f;        World.m[1][1]=cosf(Scale); World.m[1][2]=0.0f;        World.m[1][3]=0.0f;
World.m[2][0]=0.0f;        World.m[2][1]=0.0f;        World.m[2][2]=sinf(Scale); World.m[2][3]=0.0f;
World.m[3][0]=0.0f;        World.m[3][1]=0.0f;        World.m[3][2]=0.0f;        World.m[3][3]=1.0f;

Единственное отличие от предыдущего урока - это изменение матрицы согласно описанию выше. Как вы можете заметить, мы умножаем все три координаты на числа, меняющиеся от -1 к 1 и назад. В полуинтервале (0,1] треугольник переходит от очень маленького размера до своего исходного, а в случае нулей на диагонали матрицы исчезает совсем. Между [-1,0) он ведет себя так же, но выглядит отраженным относительно горизонтальной прямой, проходящей через середину окна. Это происходит из-за того, что значения по диагонали меняют знак на отрицательный.

powered byDisqus