Помогите понять струкутру матрицы для transformation DirectX 11 C++

Рейтинг: 0Ответов: 1Опубликовано: 26.01.2023

Представим что на текущей стадии у нас есть результат в виде хексагона:

2D Hexagon

для того, чтобы совершить ротацию для данной фигуры, необходимо создать струкутуру данных 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) используя '-'.

Ответы

▲ 2Принят

Чтоб понять откуда берутся 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)