Libgdx中Viewport和camera的区别是什么?

12

我是LibGdx框架的新手,对视窗和相机的使用感到困惑。有人能简单地说明它们之间的区别以及两者的用途吗?


2
这个关于它们之间的区别的问题并不是特定于libgdx的。这里有一个通用的解释:https://gamedev.stackexchange.com/questions/75991/camera-vs-viewport 而这里则是如何在libgdx中同时使用两者的方法:https://github.com/libgdx/libgdx/wiki/Projection,-viewport,-&-camera - mbdevpl
@mbdevpl 这是LibGDX特定的,因为LibGDX超载了“viewport”这个术语,除了OpenGL用于它的含义之外,还有其他两个含义。 - Tenfour04
3个回答

18

相机定义了观察点和画面中可见世界的大小。在游戏中,所有图像都是通过相机来观察的,相机定义了一个可以看到世界的视图。在2D游戏中,您可以使用OrthographicCamera来定义当前可见的世界矩形。OpenGL使用矩阵来计算所看到的内容,因此使用相机时,需要对其进行更新并获取其combined矩阵以传递给SpriteBatch。

Viewport在LibGDX中有三种不同的含义:

  1. OpenGL viewport,即OpenGL当前设置要绘制像素尺寸的屏幕矩形区域。无论OrthographicCamera具有什么尺寸,它定义的可视世界矩形将被拉伸以适应OpenGL viewport,这意味着它可能会出现扭曲或压缩的情况。

  2. OrthographicCamera的viewportWidth和viewportHeight。这些术语是LibGDX早期的遗留物,当时假定您将始终使用大小等于OpenGL viewport的相机。实际上,这些术语描述的是您可以看到的世界矩形的大小,但是这个可见矩形可以具有任意尺寸,并且最终的图像将被拉伸以适应OpenGL viewport。

  3. Viewport类是一个同时管理OrthographicCamera和OpenGL Viewport的类,以实现特定的屏幕密度和宽高比策略。

通过提供世界宽度和世界高度来设置LibGDX视口类,从而定义了一个您希望在屏幕上看到的游戏世界矩形。根据使用的Viewport类型,此矩形将以某种方式用于针对多个屏幕大小进行调整。

以下是LibGDX包含的一些视口示例:

StretchViewport: 它会拉伸您的世界宽度/高度以适应屏幕,即使这会导致变形。这不应该用于发布的游戏中,因为玩家会讨厌它。只适用于非常快速和简单的原型制作。

FitViewport: 它会将你的世界的宽度/高度扩大以适应屏幕,并对OpenGL视口进行黑边处理,以避免图像失真。这就像在电视上观看电影时看到的黑边一样。这是设计游戏最快速/最简单的方式,因为你知道你的世界在所有设备上可见的矩形区域是完全相同的。但是你的玩家可能不喜欢浪费的屏幕空间。如果你将其用于iOS游戏,苹果公司将会拒绝。

ExtendViewport: 它会将你的世界的宽度/高度扩大以适应屏幕,然后将你的世界宽度或高度扩大以填充屏幕上所有剩余的空间,从而避免图像失真。如果你不想使用黑边,这是最好的选择,但这意味着你必须考虑到需要绘制足够多的内容来覆盖计划外的世界宽度/高度区域,并尽量保持游戏的公平性。

ScreenViewport: 这个视口非常独特,因为它没有输入世界的宽度/高度。它只是使世界的宽度和高度与屏幕尺寸(以像素为单位)匹配。这绝不能用于游戏,因为在大型XHD设备上你可能会看到一个比小型MD设备大五倍或更多的矩形。但它在UI方面有用。你可以为各种屏幕密度设计多个UI元素,然后使用ScreenViewport让文本和按钮在所有设备上都看起来非常清晰。

我个人总是在游戏中使用ExtendViewport,这样就不会浪费屏幕空间,而且游戏可以在iOS上发布。

对于UI,我在游戏界面上使用ExtendViewport(将小部件推向屏幕边缘),如果有暂停屏幕覆盖在游戏界面上,则使用FitViewport。对于此类用途,FitViewport很好,因为你实际上看不到黑边。如果你知道它适合的矩形区域始终相同,那么就更容易管理复杂的暂停屏幕UI。

为了使UI看起来清晰,我会为其生成一个大约与200-250dpi手机屏幕大小相当的尺寸,并进行三线性过滤处理,以减少努力。


6

相机

简单来说,相机就像真实生活中的相机。在LibGDX中,Camera用于显示我们的游戏区域。

例如:拍电影时,导演会做很多准备工作,并通过相机捕捉到所有的画面。同样,在libgdx中,我们创建许多精灵、纹理等,所有这些东西都被相机捕捉并呈现到屏幕上。简单地说,相机显示游戏区域。

视口

Viewport主要用于使我们的游戏在多个设备上可视化兼容。

不同的设备有不同的宽高比。当游戏在不同设备上运行时,可能会出现一些图形问题(拉伸图像、角色超出屏幕等)。LibGDX提供了Viewport来解决这个问题。

有三种主要类型(不限于)的Viewport可用:

  1. StretchViewport
  2. FillViewport
  3. FitViewport

有关更多详细信息,请查看以下链接:

LibGDX - Viewports

LibGDX - Projection, Viewport & Camera


2
相机就像一只眼睛,它显示它所看到的东西。视口只是决定相机观察到的物体如何呈现。例如,如果您有一个使用非常小的精灵的游戏,并决定将其放在大屏幕上,图像会很小。这就是视口发挥作用的地方。它的任务就是适当地“扩展”图像,以便您不必担心不同的屏幕分辨率。
附言:我知道我的回答有点晚,可能过于简单,但我希望对初学者有所帮助。并且我想明确表示,我自己也不是专家。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接