2

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

我试图在没有外部库的情况下做到这一点,以防有人想知道。

有谁知道我是否在这个方向上遥遥无期?将变换应用于图像坐标?我从矩阵中输入和输出的数据到底是什么?我了解矩阵是什么,但我在这方面的经验有限,我真的不知道下一步。

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

我所有的源代码:mainComponent、vector2f、matrix3f 和 transform。

到目前为止的类中的概述:mainComponent 相当明显,现在只是 Main()。Vector2f 具有用于 2D 向量(浮点数)的基本数学、getter 和 setter。Matrix3f 具有平移、旋转和缩放矩阵的初始化以及乘法方法。而且我不知道 Transform 到底在做什么,我只知道在那里,我的矩阵被设置,接受它们的输入并相乘。真的不知道该怎么做才能将它附加到屏幕上的某些东西上,尽管我可以制作一个可能是我想要的基本 BufferedImage 像素阵列的东西。

下一个问题是加载精灵:/

4

1 回答 1

3

理论

翻译矩阵如下所示:

[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')图像中的位置并将其设置为红色。重复直到您以这种方式转换了所有像素。

于 2013-11-14T18:59:42.437 回答