了解 libGDX 投影矩阵

在过去的几周里,我一直在尝试学习libGDX库。我发现很难理解相机/视口关系系统,特别是对于我第一次尝试游戏开发。我被告知要使用的一行代码,以及API提到的代码,是:

    batch.setProjectionMatrix(camera.combined);

尽管进行了4个小时的研究,我仍然缺乏对这段代码功能的完整理解。根据我的基本理解,它“告诉”批处理相机正在看的地方。我的缺乏理解力令人沮丧和愤怒,如果有人能帮助我,我将不胜感激。代码片段的另一个问题是,我不确定何时需要实现(在渲染方法中,创建方法等)。


答案 1

考虑用相机拍照。例如,使用智能手机相机拍摄公园长椅的照片。当你这样做时,你会在智能手机的屏幕上看到公园里的长凳。这似乎非常明显,但让我们看看这涉及什么。

长凳在照片上的位置是相对于您拍照时站立的位置而言的。换句话说,它是相对于相机而言的。在典型的游戏中,您不会相对于对象放置对象。相反,您将它们放在您的游戏世界中。游戏世界和相机之间的平移是使用矩阵完成的(矩阵只是一种转换坐标的数学方法)。例如,当您将相机向右移动时,工作台在照片上向左移动。这称为视图矩阵。

长凳在图片上的确切位置还取决于长凳和相机之间的距离。至少,它在3D中确实如此(2D非常相似,因此请继续阅读)。当它离得更远时,它更小,当它靠近相机时,它更大。这称为透视投影。您还可以使用正交投影,在这种情况下,对象的大小不会根据到相机的距离而变化。无论哪种方式,公园中长凳的位置和大小都会转换为屏幕上的位置和大小(以像素为单位)。例如,公园内的长凳宽2米,而照片上的长凳为380像素。这称为投影矩阵。

camera.combined表示组合视图和投影矩阵。换句话说:它描述了游戏世界中的内容应该在屏幕上的什么位置呈现。

调用指示批处理使用该组合矩阵。每当值更改时,都应调用它。这通常是在调用时,也是在您移动或以其他方式更改相机时。batch.setProjectionMatrix(cam.combined);resize

如果您不确定,则可以在方法的开头调用它。render


答案 2

另一个答案非常好,但我认为一种不同的描述方式可能有助于它点击。

您通常在“世界空间”中处理您的游戏,这是一个类似于现实世界的坐标系。在线性代数中,通过将点的坐标乘以表示两个坐标系之间关系的矩阵,可以将空间中的点从一个坐标系转换为另一个坐标系。

将视图矩阵乘以一个点,以将其从世界空间转换为相机空间(相机的视角)。投影矩阵用于将点从相机空间转换为屏幕空间(设备屏幕的平面 2D 矩形)。当您在 Libgdx 中调用摄像机时,它会将您对位置、方向、视口大小、视场等的最新更改应用于其视图和投影矩阵,以便它们可以在着色器中使用。update()

您很少需要在2D中处理相机空间中的东西,因此SpriteBatch不需要单独的视图和投影矩阵。它们可以组合成一个矩阵,直接从世界空间转换为屏幕空间,这在相机中已经自动完成,因此矩阵。camera.combined

SpriteBatch 具有默认的内置着色器,可将此投影矩阵乘以精灵的所有顶点,以便将它们正确映射到平面屏幕。

每当您移动相机或调整屏幕大小时,您都应该打电话。setProjectionMatrix

还有第三种类型的矩阵,称为模型矩阵,用于3D内容。模型矩阵描述模型在世界空间中的方向、比例和位置。因此,乘以模型中的坐标,将它们从局部空间移动到世界空间。


推荐