当前位置: 首页 > 网络应用技术

OASIS InputManager设计和实施

时间:2023-03-05 19:25:30 网络应用技术

  交互式输入是发动机功能层中非常重要的功能。它允许用户使用设备,触摸或手势与应用程序与应用程序进行交互。在0.6里程碑中,我们最初建立了绿洲相互作用系统。目前,我们已经支持点击。键盘,本文将与您分享开发过程中的想法和不足。

  输入设备,触摸,XR设备等是交互式系统的输入。在OASIS中,我们收集了输入管理器(InputManager)的所有输入逻辑,然后根据各种类型的输入(各种TypespointerManager的输入)和键盘管理器(键盘管理器)和其他特定输入对触摸管理器进行了细分。经理负责所有特定的输入经理。在交互式框架处理中,您只需要处理每个管理器中特定输入的逻辑。

  以下是绿洲运行时框架处理的生命周期:

  InputManager的内部生命周期如下:

  直接调用交互式管理器提供的方法以确定键状态。

  ISKeyHeldown返回是否连续按下此按钮以返回是否通过此按钮ISKeyup按下当前帧以及是否抬起当前帧。

  PoInterevent是鼠标的下面开发和触摸交互作用的动量。指针是输入设备的硬件层。开发人员不需要关心数据源,触摸板或触摸屏的来源,但是它也存在一些兼容性问题。请参阅Caniuse,Pointerevent的设备覆盖率为92.82%,并且需要通过导入Polyfill来解决。

  将钩函数添加到响应脚本组件中的指针。对于在三个维空间中具有碰撞量的实体,开发人员可以通过补充相应的挂钩函数中的逻辑来轻松实现点击,拖动和选择中间交互式操作。

  当接触点离开实体的碰撞范围时,触摸点进入实体的碰撞时,OnPointerenter触发了OnPoInterExit。当松开实体的碰撞范围时,当触摸点在触摸点被按下并放在碰撞范围内时,它会触发OnPointerick将实体放松时触发该实体,并触发onpoInterdrag。

  像Mouseevent和TouchEvent一样,也可以通过监视捕获Pointerevent。

  按下Mousedowatouchstartpointerdown Lift Lift MouseUptouptouchendPointerup移动MouseMovetouchMovePoInterMove,然后离开Mouseout |MouselaveAveTRPoincerOronCanceCeceCeceRororOrout |点

  它可以总结指针处理的一般过程,其中绿色帧代表本地事件。

  指针中要解决的最大问题是如何根据本机事件中的位置信息在三维空间中进行射线检测,因为内容的这一部分不仅包含空间转换的基本知识,还包含基本知识使用物理系统。

  捕获Pointerevent之后,我们需要

  Clientx&客户端的触发事件应用区域(视觉区域坐标)的坐标(视觉区域坐标)和Offsety的坐标Pagex&Pagex&Pagey的坐标(包括滚动区域)screenx&Screeny与主显示器左上角的主显示屏幕相比整个文档坐标。角度的坐标(基本上未使用)x&y和clientx&clienty它们具有以下转换关系(假设本机事件是,单击的目标元素为):

  可以获得的结论是,大多数坐标属性都可以获取预期的坐标信息,即主机是最直接和最方便的地方。

  简化射线检测。基于屏幕上屏幕的坐标,以在三维空间中获取射线,然后与三维空间的碰撞检测相撞。

  以视角相机为例。在屏幕上获取坐标后,您只需要完成以下步骤即可获取光线:

  使用图形引擎的学生更熟悉我们渲染时的以下更改:

  似乎您只需要获取屏幕空间的坐标,然后通过几个空间转换的逆变器即可。

  Offset->宝藏空间需要对像素(像素),设备独立像素(DIPS和设备像素比(DivicePixelRatiowHen)求解屏幕空间坐标,您需要注意分子和分母的一致性。

  裁缝空间是-1至1的XYZ范围的左手坐标系(可以将切割空间理解为当渲染范围超过此间隔时切断渲染范围)。在这里转换时请注意:

  屏幕空间的点 - >世界空间的无线电宣传以矩阵作为主要序言。

  以视角相机为例,可以通过视图转换和项目转换将世界空间转换为切割空间,因此它只需要体验从切割空间到世界空间的这些转换的倒数。

  上层中期的深度和远面平面的深度依次找到触摸点,在附近的平面和世界坐标空间的远面平面。连接这两个点以获取检测光线。

  碰撞体由常规的几何体(Cuboid,Sphere等)组成。

  当物理引擎返回碰撞体时,可以认为这是当前帧的所有回调。在此链接中,您只需要根据收集的本机事件调用脚本即可。

  正如开头提到的兼容性问题一样,如果您的OASIS项目可能在计算机的低系统版本中运行,我们可以导入自定义的PointerPolyFill。

  https://github.com/oasis-engine/polyfill-pointer-event

  当按下键盘键时触发键盘键时,键入键键。

  键盘处理的一般过程可以汇总,绿色框架代表天然事件。

  无论是在不同情况下的布局还是不同的键盘的布局下,密钥都是枚举的值。如果可以以枚举形式存储关键值,则将为性能和使用带来极大的便利性。因此,有必要确定适合作为枚举价值的属性。

  以下是可以用作关键词中的枚举值的属性:

  代码的物理按钮触发事件,与布局,无论是布局,按下y键时无关。“ y”与charcode兼容已被放弃

  钥匙码已被放弃

  char放弃了

  可以发现最适用的属性是代码,请参阅https://w3c.github.io/uievents-code/。

  每个帧按钮的交互式逻辑相对简单。维护压力和放松并持有三个阵列可以满足所有需求。重点是如何减少帧水平的增加,删除并检查操作的性能损失。