解读模拟摇杆原理及实验

解读模拟摇杆原理及实验

Interpreting Analog Sticks

当游戏支持控制器时,玩家可能会一直使用模拟摇杆。在整个体验过程中,钉住输入处理可能会对质量产生重大影响。让来看一些核心概念以及INVERSUS示例。

检查

在调整模拟摇杆之前,需要了解其工作原理。当移动摇杆时,实际报告的硬件什么?这是INVERSUS的摇杆检查的样子。并不是说这是最好的显示方式,但是所有传达的信息都很重要。

在详细介绍每个部分之前,让给出一个高层次的概述。正在使用连接到PC的Xbox 360控制器。第一行代表左杆上的加工阶段。最下面一行是右摇杆。会注意到,第一行比第二行显示的数据更多。这是因为INVERSUS仅使用左摇杆,并且得到了特殊处理。只会从听到的角度谈论最上面的那一行,但是对于使用游戏,一切仍然适用于正确的方法。

硬件抽象

前两个圆圈表示从特定硬件(例如Xbox 360控制器或DualShock 4控制器)转换为公共输入空间的操作。不同的硬件是不同的。机械上有所不同,感觉也有所不同。可以说这是一个显而易见的事实,但可能没有考虑过。

假设在游戏机A上开发游戏,然后将其移植到游戏机B。需要保持原始调整的质量。如果模拟摇杆的行为不同,则会感觉有些不舒服。这个想法是将x,y值从受支持的硬件空间转换成一个公共游戏空间。现在可以将游戏层调整为与控制器类型无关。

 径向死区

第一阶段代表径向死区处理。由于结构上的限制或使用中的磨损,硬件可能报告不良值。此阶段从游戏中删除了所述不可靠的值。

那么在看什么呢?红色正方形用左下角的(-1,-1)和右上角的(1,1)限制坐标系。沿X轴和Y轴分为四个象限。鲜红色的圆圈是单位圆圈。这些准则在以下每个阶段均保持不变。

小绿色圆圈是输入值。因为这是第一步,所以这些是直接形成硬件的原始值。绿色轨迹显示通过线段连接的输入(绿色点)的最新历史记录。白色小圆圈是该阶段的已处理输出。

在此阶段独特的是,还有两个圆圈:内部死区和外部死区。

内部径向死区

内圆内的值不能被信任。这是内部死区。在图像中,正在不经任何阻力的区域轻轻移动棍子。此处不会将棍子拉回到死点。随着管制员的年龄和虐待,该地区将增长,转移和扭曲。

内部死区中的每个值都映射为零,从而为提供了可靠的游戏逻辑起点。会注意到白色输出圆圈始终保持锁定在中心。如果内部死区太紧,则当棒移到外面时运动可能会漂移。

硬件供应商通常会提供建议的内部死区值。这是一个不错的起点,但是应该在尽可能多的控制器上进行自己的测试。这些推荐值可能并不完美,使用硬数据进行验证也不会受到损害。

径向外死区

外圈外的值不能被信任。这是外部死区。大多数游戏在内部死区方面都可以接受,但是由于外部死区较差(或不存在),可能会发现错误。

在第一个图像中,将操纵杆笔直向上移动到顶部边缘,然后围绕边缘逆时针滑动。在顶部,报告单位圆上或单位圆之外的值。生活并不完美,这是可以预期的。但是,当向左滚动棒时,实际上会在单位圆内切开一点,然后再向后伸出。此行为并非对所有控制器类型都通用,但是在Xbox 360控制器上可能会发生。

根据这些数据,可能会认为左侧不准确,但并非如此简单。在第二张图片中,首先将操纵杆直接向左移动。在这种情况下,将按预期报告。只有将其旋转一圈后,才能看到错误。

如果错误仅在旋转之后发生,那么有多重要?根据游戏的不同,可能非常重要。想象一个游戏,摇杆的大小控制着玩家的速度。如果玩家角色向上移动并向左倾斜,则将在最大速度下稍稍移动,直到释放并再次伸出手柄为止。

外死区之外的每个值都按比例缩放为1。这为游戏逻辑创建了一个可靠的单位圈。请注意,输出(白色圆圈)保持锁定到边缘。

不幸的是,外部死区可能没有任何推荐值。再次执行自己的测试并可视化数据。插入一堆控制器,看看如何反应。游戏需要考虑的复杂动作之后可能会有细微的错误。

径向死区插值

在内部和外部值分别捕捉为零和一的情况下,如何处理中间值?为了避免任何不连续性,对比例进行线性插值。产生的逻辑可能看起来像这样:

幅度重映射

已经剔除了不良值,需要将结果数据调整为一种普通感觉。许多因素影响为什么结果在不同类型的控制器上可能会有所不同。首先,有不同的径向死区在起作用。第二,物理棒在不同的角度可以具有不同的阻力。第三,棍棒的形状可能不同:棍棒处于不同的高度会导致拇指产生不同的扭矩。最后,并不总是位于控制器上的同一位置。

通过用曲线重新映射幅度,可以感觉  像推杆50%或75%都能  报告一致的输出,而与硬件无关。将永远无法获得如此完美的体验,但总比什么都不做要更好。

INVERSUS的情况下,Xbox 360控制器是基准,因此重映射曲线仅为(输出=输入)或(y = x)。该曲线作为对角线覆盖在图像上。曲线的输入(幅度)呈现为在屏幕上滚动的垂直线。该线在输出值处与曲线相交。在这种特定情况下,输入和输出是相等的,但是对于备用控制器,使用三次样条使感觉更像Xbox 360控制器。

稍后,将进行另一个曲线重映射以及一个显示非平凡曲线的示例。

形状重映射

如今,此步骤已不是必需的操作,实际上不支持INVERSUS,但想提一提。有时,控制器是使用不会输出值圈的硬件开发的。可能在正方形中输出某些内容,或者谁知道什么。在这种情况下,需要做一些额外的预处理,以将空间重新映射到起点。可视化数据,查看发生了什么,并采取相应的措施。

PC并发症

在跳出硬件抽象层之前,想讨论PC游戏特有的复杂性。任何时候使用PC硬件-无论是用于图形,音频还是输入-事情都比控制台复杂一个数量级。在控制器输入的情况下,实际上并没有那么遥远。希望不久的将来可以删除此部分。

问题的症结在于,  XInput不会告诉是否插入了Xbox 360控制器或Xbox One控制器。不知道为此提供任何支持的接口(并且对听到其方法非常感兴趣)从任何已经解决人)。这导致多个问题。首先,无法从开始/返回到查看/菜单之类的操作来自动调整按钮图标。其次,无法在不同的控制器类型之间重新映射振动强度。第三(与本文更相关),不能自动调整径向死区。

在输入保真度方面,Xbox One控制器是更好的设备。不需要360控制器的较大外部盲区。不幸的是,在不知道连接哪一个的情况下,最好的选择是将Xbox One控制器限制在Xbox 360的死区中。

如果对对降低PC骇客攻击的想法不感兴趣,可以跳至下一部分。否则,这是目前对如何解决INVERSUS(手指交叉)的想法。

最初考虑过使用Windows Raw InputHID API “重写” XInput 。从设备读取数据并不难。为灯光和电机发送数据会比较棘手,但可行。不幸的是,XBox 360控制器被构建为不适合作为HID设备使用。模拟触发器不能独立读取。认为这样做是为了提升XInput,但老实说不确定。

后来考虑绕过HID接口并直接与USB通讯。认为这意味着要编写驱动程序。觉得这太过分了。甚至可能达到无法向用户隐藏的程度。

最近,想到了一个新主意。实际上还没有实现,这有点疯狂,但是确实拥有所有数据来使之成为可能[UPDATE:这完全可行]。可以使用原始输入来识别已连接的Xbox 360和Xbox One控制器。也可以使用Raw Input从控制器接收HID输入数据。通过将原始输入的数据子集与XInput的数据(例如按钮按下和模拟摇杆)进行比较,可以将设备从一个系统映射到另一个系统。这应该允许对XInput使用的控制器进行分类。从理论上讲,这在旧版本的XInput中也将起作用,因此支持旧版本的Windows。

游戏意图

已经清理了数据并将其放入游戏可以处理的公共空间。从这里开始到每个游戏的细节可能会变化,但是INVERSUS使用的阶段适用于大多数游戏。还应该提到,具有多个上下文的游戏(例如,上下车)可能会根据上下文切换设置。

角死区

玩家会尝试指向通用和特定的方向。对于INVERSUS,玩家在显示器的二维平面内移动。通常尝试直接向右或直接向上移动。在矩形屏幕上的2D游戏中,可以轻松查看垂直和水平对齐方式。与离开左侧5度角相比,玩家更有可能尝试并准确地直接向左侧行走。因此,做到这一点应该很容易。

通过定义一组由角度死区限制的方向来处理此问题。在此区域中时,输出将直接映射到指定方向。在图像中,有四个盲区:上,下,左和右。当输入(绿色圆圈)处于盲区时,输出(白色圆圈)被锁定到相应的轴。类似于径向死区,可以平滑地内插每个相邻死区之间的角度。输出(白色圆圈)在移动时不会弹出。请注意,此操作需要首先转换为极坐标。对角度值进行运算后,可以转换回笛卡尔坐标。

还可以根据到原点的距离,用曲线调整盲区的角宽度。如果想更轻松地进行细微的轴向运动,可以弯曲死角,使死角在中心变宽。

将针对角度死区提到其一些用例,因为可能并不明显。3D游戏导航怎么样?对于摄像机的相对运动,玩家通常会尝试移入/移出摄像机,或左右移动。这适用于第三人称和第一人称场景。3D相机控制怎么样?在第三人称和第一人称游戏中,通常使用横向摇杆动作来转动角色。玩家不想在此过程中稍微上下移动相机。使容易。类似的逻辑适用于直视或直视。最后,让讨论一下可能需要更简单设置的情况。在驾驶游戏中,玩家经常希望准确地向前或向后行驶。顶部的死区和底部的死区可能就足够了。

灵敏度重新映射

这与用于硬件幅度重映射曲线的操作相同。还使用相同的调试渲染。被拆分,以便可以以与硬件无关的方式来调整游戏的感觉。不需要为每种受支持的控制器类型重做工作。

这条曲线的形状是特定于游戏的,但是很可能从低处开始并向上弯曲。这将使更多的灵敏度移至摇杆的外部,从而更易于进行调整。此曲线的细微变化在游戏的玩法中可能具有惊人的重要作用。值得拨出一些坚实的时间进行迭代。

INVERSUS的情况下,曲线比大多数游戏可能想要的要陡一些。这是因为不同的移动速度对游戏设计有多大用处。还在曲线的开头添加了另一个细微差别。立即上升非常快。此调整特定于游戏物理的工作方式。决定在该点下的输出对播放器没有用,想充分利用输入范围,所以不会浪费任何东西。

最终输出

最终显示屏显示完全处理过的胶棒值。在这里,可以验证是否能够达到游戏所需的期望方向和幅度。如果运行良好,可以开始在角色物理领域进一步调优。就是说,对于游戏而言,这可能不是终点。不断询问可以做些什么来改善体验。

了解翻译

并排渲染所有阶段可全面了解输入管道。这有助于假设调整并验证结果。玩家通过控制器的语言与游戏对话,翻译可能会很混乱。需要 通过此模糊翻译步骤来帮助指导  特定意图。如果可以进行准确的翻译,则可以制作一个严格的控制游戏。

 

 

 

原文地址:https://www.cnblogs.com/wujianming-110117/p/13297010.html