2013-11-14 5 views
1

Я хотел бы сделать 2D-движок игры, который сильно ориентирован на векторы. Я также хотел бы использовать матрицу преобразования для перевода, поворота и масштабирования спрайтов, которые я бы хотел каким-то образом загрузить.Как реализовать матрицу 2D-преобразования?

Я пытаюсь сделать это без внешней библиотеки на случай, если кто-то задается вопросом.

Кто-нибудь знает, если я даже дистанционно в правильном направлении с этим? Применение преобразования к координатам изображений? И какие данные мне нужно вводить и выводить из моей матрицы? Я понимаю, что такое матрицы, но мой опыт в этом ограничен, и я не знаю следующего шага.

В любой момент это немного абстрактно, и я бы хотел, чтобы я мог объяснить это лучше.

All my source code: mainComponent, vector2f, matrix3f and transform.

Очерк того, что находится в классах: mainComponent довольно очевиден, просто Main() в минуту. Vector2f имеет базовую математику, геттеры и сеттеры для 2D-векторов (float). Matrix3f имеет инициализацию матриц трансляции, вращения и масштабирования и метод умножения. И я понятия не имею, что Transform действительно делает, все, что я знаю, это то, что там мои матрицы устанавливаются, берут свои входы и размножаются вместе. Не знаю, что делать, чтобы прикрепить его к чему-то на экране, хотя я могу создать базовый элемент массива пикселей BufferedImage, который может быть тем, что я хочу.

Следующая проблема загружается в спрайтов:/

+0

Вы умножаете исходные координаты объекта (v.g. vertex) на матрицу преобразования и получаете новые координаты функции. – SJuan76

+0

вправо, поэтому мне нужно превратить свои координаты в однородную матрицу 3x1, чтобы ее можно было умножить? (и наоборот) –

+0

Да, это так. Обычно вы просто используете матрицы как координаты, без конверсий. – SJuan76

ответ

2

Теория

матрица перевод выглядит следующим образом:

[1 0 tx] 
[0 1 ty] 
[0 0 1] 

где tx является перевод на оси х, и ty - это перевод по оси y.

Теперь это матрица 3x3. Поэтому нам нужно умножить его на вектор 3x_. Но все наши точки в двух измерениях.

Таким образом, мы используем однородные координаты, то есть для данной точки (x,y), мы представим его в виде вектора:

[x,y,1] 

Теперь мы можем умножить матрицу перевода на вектор:

[1 0 tx] 
[0 1 ty] x [x,y,1]' = [x + tx, y + ty, 1]' 
[0 0 1] 

Если мы понижаем однородную величину, получаем нашу новую координату.

Применение

Так как же мы применим преобразование к изображению. Это довольно просто, просто просмотрите все точки изображения и умножьте их на матрицу преобразования, чтобы получить новое местоположение.

Если применить матрицу вращения к пикселю в точке (12, 14) с цветом красного:

[cos(theta) sin(theta) 0] 
[-sin(theta) cos(theta) 0] x [12, 14, 1]' = [x', y', 1] 
[0   0   1] 

Теперь мы находим позицию (x',y') в изображении и установите его в красный цвет. Повторяйте, пока не измените все пиксели таким образом.

+1

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

+0

@SamWalls Пишите тесты JUnit. Доверьтесь мне. : D – sdasdadas

+0

ну, это выглядит как другая область, которую я не собираюсь на некоторое время, выглядит удобно. –

Смежные вопросы