Как Векторы и Матрицы работают в компьютерной графике, такой как Матричные Вращения? - PullRequest
0 голосов
/ 01 декабря 2011

Я пытался понять, как мои знания по линейной и векторной алгебре сочетаются с компьютерной графикой.Частичные знания в языке C #

Я имею в виду следующие знания: Точки Векторы Матрицы Матричное умножение - вращения, перекосы и т. Д.

Вот моя цель: создать простое поле и применить вращение,перевод и перекос к нему с помощью умножения матриц.После этого начните возиться с камерой.Я хочу сделать все это сам, используя только те функции, которые на самом деле принимают данные и рисуют их.Я хотел бы создать все логические вещи между ними.

Вот что я получил до сих пор: мой пользовательский класс Vector3, который содержит переменные -X, Y и Z (с плавающей точкой) - несколько статических матриц (как2x2 2d массивы с плавающей точкой?), Которые содержат матрицы ZERO и TRANSLATION (для 2x2 и 3x3). Методы 1. Rotate (float inAngle) - создает матрицу вращения и умножает на нее xyz.2. Translate (inx, iny, inz) - добавляет входные переменные в переменные-члены 3. и т. Д.

По завершении я перевожу вектор обратно в класс C # Vector3 и передаю его классу рисования., например DrawPrimitiveShapes, который будет рисовать линии.

Класс бокса выглядит так: 4 Vector3's, UpperLeftX, UpperRightX, LowerLeftX, LowerRightX

a Класс Draw, который использует 4 точки для рендеринга линийкаждому из них

Мое замешательство заключается в следующем:

Как мне повернуть это поле?Я на правильном пути, используя 4 вектора для коробки?Должен ли я просто повернуть все четыре вектора на угол и покончить с этим?Как вращается текстура, если в середине находятся все данные текстуры?

1 Ответ

0 голосов
/ 03 декабря 2011

Способ, которым я научился, заключается в использовании верхнего уровня, встроенного в методы Xna, и использовании «Reflector» для просмотра внутри этих методов, чтобы увидеть, как они работают.

Чтобы повернуть прямоугольник, каждая из четырех вершин нуждается вбыть преобразованным из того места, где они были: количество градусов вокруг конкретной оси.

В Xna 2d ось всегда является осью Z, и эта ось всегда проходит через начало миров,верхний левый угол экрана в xna.

Таким образом, чтобы повернуть четыре вершины прямоугольника в xna, вы должны сделать что-то вроде этого:

foreach(Vector2 vert in vertices)
{
   vert = Vector2.Transform(vert, Matrix.CreateRotationZ(someRadians));
}

Это заставит вершины вращаться (орбита) в верхнем левом углу экрана.

Чтобы повернуть прямоугольник на месте, сначала необходимо переместить прямоугольник в верхний левый угол экрана, немного повернуть его, а затем переместить назад.Все это происходит в одном кадре, поэтому пользователь видит только вращающийся прямоугольник.Есть много способов сделать это в коде, но вот мой любимый:

// assumes you know the center of the rectangle's x & y as a Vector2 'center'    
foreach(Vector2 vert in vertices)
    {
       vert = Vector2.Transform(vert - center, Matrix.CreateRotationZ(someRadians)) + center;
    }

Теперь, если вы хотите отразить метод Matrix.CreateRotationZ или метод Vector2.Transform, вы увидитестроки кода MS использовались, чтобы заставить это работать.Работая с ними, вы сможете более эффективно изучать математику без лишних проб и ошибок.

...