Помогите понять струкутру матрицы для transformation DirectX 11 C++
Представим что на текущей стадии у нас есть результат в виде хексагона:
для того, чтобы совершить ротацию для данной фигуры, необходимо создать струкутуру данных Constant Buffer и непосредственно привязать это к пайплайну. Объявление матрицы для transformation:
struct ConstantBuffer
{
struct
{
float element[4][4];
} transformation;
};
Затем создаётся объект данной структуры в виде:
const ConstantBuffer ConstBuff =
{
{ std::cos(angle), std::sin(angle), 0.f, 0.f,
-std::sin(angle), std::cos(angle), 0.f, 0.f,
0.f, 0.f, 1.f, 0.f,
0.f, 0.f, 0.f, 1.f,
}
}
angle - это параметр который передаётся методу внутри которого и создаётся ConstBuffer и этот метод вызывается каждый фрейм с разными значениями angle.
Каким образом работает трансформация фигуры в данном случае и зачем на первые два элемента первого и второго ряда матрицы идёт применение cos и sin функций для angle, при этом одна из них "отрицается" (negate) используя '-'.
Ответы (1 шт):
Чтоб понять откуда берутся sin, cos, + и - в коэффициентах левого верхнего угла матрицы стоит для начала рассмотреть плоский случай.
Возьмём декартову плоскость, и нарисуем на ней единичный квадрат с координатами вершин в точках (0,0), (1,0), (0,1) и (1,1).
Теперь повернём этот квадрат вокруг точки (0,0) на угол a (положительное значение a соответствует вращению против часовой стрелки).
Из школьного курса геометрии мы знаем, что:
Точка (1,0) переместится в координаты (cos(a),sin(a)) — это, собственно, определение синуса и косинуса.
Для малых углов a (< 90 градусов) очевидно, что точка (0,1) сдвинется влево (в сторону отрицательных значений, в минус), настолько же, насколько точка (1,0) поднялась вверх. Её координаты станут (-sin(a),cos(a)). Для больших значений a эта формула также верна, но будет не так очевидно откуда минус.
Точка (1,1) переместится в координаты (cos(a)-sin(a), sin(a)+cos(a)), это просто сумма координат новых положений точек (1,0) и (0,1).
Можно продолжит изыскания с любыми размерами квадрата, сделав его прямоугольником со сторонами x и y, и заметить, что точка с координатами (x,y) при повороте на угол a вокруг начала координат оказывается в координатах (x*cos(a) + y*(-sin(a)), x*sin(a) + y*cos(a)).
А получение вектора с координатами (x*a11 + y*a12, x*a21 + y*a22) из вектора (x, y) — это результат умножения вектора (x, y) на матрицу
a11, a21
a12, a22
Смотрим чему равны коэффициенты в формуле поворота, и получаем матрицу линейного преобразования:
cos(a), sin(a)
-sin(a), cos(a)
