【问题标题】:How do I implement a 2D transformation matrix?如何实现二维变换矩阵?
【发布时间】:2013-11-14 18:40:32
【问题描述】:

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

如果有人想知道,我正在尝试在没有外部库的情况下执行此操作。

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

现在有点抽象,我希望我能解释得更好。

All my source code:mainComponent、vector2f、matrix3f 和变换。

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

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

【问题讨论】:

  • 将特征(例如顶点)的原始坐标乘以变换矩阵,得到特征的新坐标。
  • 对,所以我必须把我的坐标变成一个 3x1 齐次矩阵,这样才能相乘? (反之亦然)
  • 是的,没错。通常只使用矩阵作为坐标,无需转换。
  • 您也可以一次将所有积分相乘。因此,如果您有 256x256 个点,您将得到变换矩阵 (3x3) 与点矩阵 (3x65536) 的矩阵乘法。这将产生一个新的点矩阵,其中每一列都是您的新点位置。

标签: java vector matrix 2d game-engine


【解决方案1】:

理论

翻译矩阵如下所示:

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

【讨论】:

  • 这看起来很有希望!看看我是否可以设置一个基本坐标输入并查看它输出的内容以检查它是否正常工作。
  • @SamWalls 编写 JUnit 测试。相信我。 :D
  • 好吧,这看起来像是我暂时不会掌握的另一个领域,不过看起来很方便。
猜你喜欢
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多