使用什么坐标系来处理2D UI?


20

长宽比问题之后,我很想听听其他人在2D UI系统(最有可能是他们自己开发的解决方案)上工作时正在使用什么。具体来说,如何处理坐标系。我认为有三种选择:

  1. 硬编码的坐标(例如:0-> 720,0-> 576)
  2. 归一化的坐标(0.0-> 1.0,0.0-> 1.0),在渲染之前映射到真实坐标
  3. 虚拟坐标(例如:0-> 1600、0-> 1000),在渲染之前已映射到真实坐标

硬编码显然仅在以下情况下有用:在固定平台上并且事先知道屏幕空间坐标是什么,或者准备为每组可能的屏幕尺寸编写屏幕布局。

归一化的坐标很好,但是当屏幕的宽高比不固定时(例如0.75映射到宽屏而不是4:3时,则0.75映射到不同的物理坐标)会产生歧义。同样,对于作者来说,将UI元素声明为(0.2 x 0.2)真的违反直觉,只是发现渲染时它实际上不是正方形。

虚拟坐标是明确的,但在重新映射阶段遇到与标准化坐标相同的问题:很小的十进制差异会导致偏离一对一的错误,这意味着应该平铺的UI元素之间现在有接缝。

同样,当您有固定分辨率的屏幕时,归一化坐标和虚拟坐标都意味着很难保证UI图像中艺术家的精细像素与屏幕上像素之间的1:1映射,这意味着您存在以下风险:令人讨厌的缩放伪影(假设您在屏幕上渲染为带纹理的四边形)。

我们采用了虚拟坐标方法,特别是为了避免对宽高比产生歧义。因此,当渲染到16:10屏幕时,UI空间为(0,0)->(1600,1000),但是当渲染为4:3时,可用的UI空间实际上为(133,0)->(1467 ,0)。

有我不知道的更好的解决方案吗?有什么好的策略可以最小化这三种方法的问题?

Answers:


5

我想我同意规范化的坐标不能很好地映射到UI内容。

通常,我通常对2D布局所做的基本上是您的“虚拟”坐标空间,但是我选择了一个以我首选的目标分辨率(例如1280x720)映射1:1的空间。它不是固定的,但是处理起来很直观,我知道在90%的情况下看起来都是正确的。显然,重要的是不要沾沾自喜,而要经常检查不同的分辨率。

为了在重新映射分辨率时保持清晰,我会从字体渲染中借鉴一些技巧,并提供提示信息。因此,请确保需要连续的事物以某种方式标记,同时还要对需要精确对齐的精确像素进行舍入。

也许也考虑使事情变得相对。因此,您可以指定“对象2的左下位置与对象1的右下角有些偏移”,而不是将所有内容都设置为“将对象1的绝对X,Y位置”。这样一来,在不失去重要关系的情况下,重新缩放和/或移动事物就变得更加容易。


5

CEGUI的坐标系似乎经过深思熟虑。它的统一坐标系将绝对定位与相对定位融为一体。您可以指定以下位置:

  • 在屏幕中间
    UDim(0.5,0)
  • 右边缘左侧五个像素
    UDim(1.0,-5)
  • 中间有两个小部件,但相隔10像素
    HA_RIGHT,UDim(0.5,-5) HA_LEFT,UDim(0.5,5)

2

如果有疑问,为什么不采用CSS盒模型或简化模型呢?

您可以以百分比或像素指定位置。例如,您可以使用百分比来放置容器,但是以像素为单位放置其中的项目。


1

我喜欢使用虚拟坐标,但是基于共同的目标分辨率(最好是运行游戏的最高分辨率之一)。

这些天,一个不错的选择可能是1920x1080。

可以以该分辨率创建所有艺术品和屏幕模型,并且可以轻松测量像素的位置/距离。

如果以与虚拟坐标不同的纵横比运行,则可以选择如何使其适合屏幕(信箱,裁切边或两者兼而有之)

编码时,我发现“以像素为单位思考”比在标准化坐标中思考要容易得多!-我希望文字的高度为“ 50(虚拟)像素”,而不是“ 0.0463单位高”


0

这完全取决于您所使用的GUI类型,但是游戏通常会在屏幕边缘和角落固定一些东西,然后它们可能会在屏幕中间有一个用于模式对话框或其他内容的框。

如果是这样,那么我是否建议您使用一种方案,在该方案中指定锚点和偏移量(x,y)?这将类似于Java的BorderLayout(但可能具有四个角,四个边的中间以及一个屏幕中心)。因此,例如,您可以指定距左上角的(0,0)偏移量;那么该元素将完全固定在屏幕的一角。然后,无论什么分辨率,高宽比等,您都将在屏幕的一角看到运行状况指示器。但是,如果将某个元素锚定到右上角,则该元素自然会相对于其右上角(而不是左上角)锚定,因此无论分辨率如何,它都会自动锚定到屏幕的角上。

我绝对建议不要使用标准化的0.0-1.0坐标;这些可能会根据浮点精度而有所不同。GUI应当映射到像素,除非您具有3D GUI。


好吧,对于任何类型的UI系统,几乎都可以使用相对定位和锚定。我对不同组件之间的测量特别感兴趣。对于这种情况,3D / 2D GUI的区别有点朦胧:尤其是当您使用带纹理的屏幕空间四边形来拍摄任意大小的图像,并将它们缩放/放置在您的UI空间中时。
MrCranky

0

在很大程度上取决于游戏的类型和情况。对于速度较慢的原型,我更喜欢在方格纸上规划UI,写下用于固定窗口大小的数字坐标列表,并对所有内容进行硬编码-这对我来说更容易,更快捷。但是对于需要调整窗口大小或替代屏幕分辨率的“真实”项目,这显然不是理想的选择,并且可以双向缩放的某种解决方案会更好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.