如何实现2D转换矩阵?

时间:2013-11-14 18:40:33

标签: java vector matrix 2d game-engine

我想制作一个专注于矢量的2D游戏引擎。我还想使用转换矩阵来翻译,旋转和缩放我想以某种方式加载的精灵。

我试图在没有外部库的情况下这样做,万一有人想知道。

有没有人知道我是否能在这方面做出正确的指示?将变换应用于图像坐标?我从矩阵输入和输出的数据到底是什么?我理解矩阵是什么,但我对此的经验是有限的,我真的不知道下一步。

这一切都有点抽象,我希望我能更好地解释它。

All my source code:mainComponent,vector2f,matrix3f和transform。

到目前为止,类中的内容概述:mainComponent非常明显,只需要Main()。 Vector2f具有2D向量的基本数学,getter和setter(float)。 Matrix3f具有平移,旋转和缩放矩阵的初始化以及乘法方法。而且我不知道Transform真正做了什么,我所知道的是,在那里,我的矩阵得到了设定,接受了他们的输入并且相乘。我真的不知道如何将它附加到屏幕上的某些东西上,虽然我可以制作一个基本的BufferedImage像素阵列,这可能是我想要的。

下一个问题是加载sprite:/

1 个答案:

答案 0 :(得分:2)

<强>理论

翻译矩阵如下所示:

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

其中tx是x轴上的平移,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')并将其设置为红色。重复,直到你以这种方式转换所有像素。