前端3D渲染【免费下载链接】react-360Create amazing 360 and VR content using React项目地址https://gitcode.com/gh_mirrors/re/react-360点击查看免费下载导读vr-input-source是 react-360 中负责 VR 手柄positionally-tracked gamepads跟踪与事件派发的核心基础包。它把 WebVR 时代依赖轮询的 Gamepad API 封装成类似未来 WebXRXRInputSource的事件式接口持续跟踪所有带有物理姿态的手柄、检测按钮按下/释放并派发selectstart/press等事件同时记录“最近一次被使用”的手柄作为 Active Input Source供应用决定哪只手柄负责绘制光标。读完本文你将掌握该包的完整事件模型、主/次按钮判定机制、与 react-360 上层射线检测、光束渲染、点击分发的集成方式以及如何扩展WellKnownGamepads映射来支持新设备。包定位与核心职责vr-input-source位于 packages/vr-input-source其 README 将自身职责概括为三项跟踪所有上报物理位置的手柄只关注gamepad.pose存在即位置追踪的设备忽略普通无姿态手柄在按钮按下/释放时触发事件由于 Web Gamepad API 采用轮询而非事件驱动需要每帧检查手柄状态并与上一帧做差分维护 Active Input Source多手柄如 Oculus Touch 双手柄同时使用时跟踪“最近使用”的一个典型用途是让它控制光标这是 VR 平台上的常见交互模式。包的package.jsonpackages/vr-input-source/package.json声明其描述为 “Gamepad input collection for WebVR applications”版本 0.3.0对外入口是 index.js它直接 re-export 了dist/VRInputSource编译产物。事件模型总览包对外暴露两类事件全部常量定义在 InputEventTypes.js事件触发时机类比selectstart手柄任一主按钮被按下mousedownselectend主按钮被释放或手柄在按钮按下时断开mouseupselect主按钮按下后释放完整一次点击clickpressstart任意按钮主或非主被按下mousedownpressend任意按钮被释放或手柄在按钮按下时断开mouseuppress任意按钮按下后释放clicktouchstart手指接触电容按钮/触控板—touchend手指离开电容按钮/触控板—inputsourcechange有姿态的手柄集合发生变化连接或断开—activesourcechangeActive Input Source 改变最近使用的手柄变化—其中前两类是顶层VRInputSource类的事件inputsourcechange/activesourcechange是包级Source事件常量定义同样位于该文件。为什么需要这些事件Gamepad API 的轮询缺陷Web Gamepad API 本身是轮询式的——调用navigator.getGamepads()获取快照不提供键盘/鼠标那样的回调事件。因此必须在每一渲染帧检查手柄状态与上一帧比对以判断哪些按钮发生了变化。vr-input-source对所有被跟踪的手柄统一执行这个动作派发上述事件。主按钮事件Primary Button Events主按钮是执行“选择/确认”动作的按钮不同设备各不相同。README 特别建议由于 VR 输入设备差异极大开发者应围绕单一选择动作构建界面而非依赖大量按钮的存在。三个 select 事件用于这类统一选择语义。通用按钮事件Alternative Button Eventspressstart/pressend/press用于跟踪任意按钮主或非主的按下与释放适合需要监听非主按钮如菜单键、摇杆的场景。电容按钮事件Capacitive Button Events部分手柄具有电容感应按钮或触控板touchstart/touchend在手指接触/离开时触发。注意从源码看GamepadState中_lastButtons虽记录了touched字段但update()的差分逻辑当前只基于pressed状态派发 select/press 事件GamepadState.js触控事件的完整派发链可视为 API 预留的扩展点具体以各浏览器实现的手柄touched上报为准。事件派发的底层实现GamepadState 差分检测GamepadState.js 是单个手柄的状态机核心是update(gamepad)方法每帧被调用一次源码注释明确要求 “This should be called every frame”。其差分逻辑按下检测button.pressed !lastPressed时若该按钮是主按钮则先发selectstart再发pressstart主按钮同时是“任意按钮”释放检测!button.pressed lastPressed时主按钮发selectendselect随后发pressendpress断开兜底手柄断开时update(null)对所有仍处于按下状态的按钮补发 end 类事件保证状态不悬挂——README 中selectend/pressend的定义也明确包含了“手柄在按钮按下时被断开”这一情形。每个事件 payload 都是ButtonEvent{gamepadIndex, index, primary}其中index是按钮在gamepad.buttons中的序号primary标记该按钮是否被判定为主按钮。顶层 VRInputSource 的职责VRInputSource.js 是包的顶层类职责包括初始化扫描构造时调用getGamepads()优先navigator.getGamepads回退webkitGetGamepads只对带pose的手柄创建GamepadState并记录为首个 Active Source监听连接/断开通过window上的gamepadconnected/gamepaddisconnected事件维护_gamepads数组并派发inputsourceschange断开时若该手柄正是活动源会调用setActiveSource(-1)置空并触发activesourcechangeVRInputSource.js活动源切换在_fireCallbacks中收到pressstart时自动把该手柄设为 Active SourceVRInputSource.js——这就是“最近使用优先”语义的实现点每帧刷新update()遍历所有GamepadState调用其update()上层渲染循环需每帧驱动它。GamepadState还提供getPosition()/getOrientation()姿态四元数[x,y,z,w]与isPositionEmulated()供射线投射与手柄光束渲染使用。主按钮 vs 次按钮WellKnownGamepads 映射手柄按钮的物理排布差异巨大Daydream 只有一个按钮Oculus Go 有一个按钮加一个扳机Oculus Touch、Vive Wand、Windows MR 手柄则有多个按钮。而手柄上报的按钮顺序与其意图动作几乎无关。为此vr-input-source内置了知名手柄的映射表 WellKnownGamepads.js将各设备的“主动作”映射到select事件。现有映射按gamepad.id字符串匹配手柄 ID主按钮映射Gear VR Touchpad[true]Gear VR Controller[true, true]Oculus Go Controller[true, true]Daydream Controller[true]Oculus Touch (Left)/Oculus Touch (Right)[false, true, false, true, false]thumbstick、trigger、grip、A/X、B/YSpatial Controller (Spatial Interaction Source) 045E-065B标准 MS MR[false, true, false, false, true]Spatial Controller (Spatial Interaction Source) 045E-065DSamsung Odyssey同上例如 Oculus Touch 的 A 按钮与主扳机都被映射为 primary可触发select事件而摇杆、握柄、B/Y 则不是。判定逻辑在 detectPrimaryButtons.js若gamepad.id命中WellKnownGamepads直接返回对应数组未识别手柄默认把所有按钮都标记为 primary。这是刻意的未来兼容设计——避免新硬件发布后开发者不得不升级旧应用去添加映射。因此若你遇到未覆盖的新手柄且希望更精确的主按钮语义只需在该表中按gamepad.id追加映射数组README 明确说明该表可更新以支持新输入类型。姿态数据与位置模拟GamepadState构造函数从gamepad.pose读取orientation/position。当设备只有朝向没有位置pose.hasPosition为假时会调用 emulatePosition.js 用虚拟手臂模型估算位置将手臂向量(0, 0, -0.4)按手柄朝向四元数旋转再根据hand left在 x 轴偏移-0.3/0.3y 轴统一偏移-0.3模拟出位于身体前方的手部位置。因此getPosition()返回的可能是模拟位置而非真实传感器数据通过isPositionEmulated()可判断位置是否来自虚拟手臂模型这种机制让只有 3DoF 朝向追踪的设备如 Daydream也能参与射线/光标交互无需绝对位置。在 react-360 中的集成从事件到光标与点击vr-input-source并非孤立工具它是 react-360 控制器体系的底座上层消费方式可从以下源码印证点击分发packages/react-360/src/Container.js 中vrInputSource.addEventListener(selectstart / selectend)会向所有 Surface 的 ReactRoot 派发input事件buttonClass: confirmaction: down/up与鼠标的mousedown/mouseup路径并行——这就是手柄选择按钮驱动 UI 点击的实现活动源追踪光标ControllerModel.js 监听activesourcechange当gamepadIndex 0活动源断开/清空时隐藏手柄光束模型否则显示——即“最近使用手柄绘制光束”射线检测ControllerRaycaster.js 通过getActiveSource()获取当前活动GamepadState用getOrientation()旋转出射线方向、用getPosition()作为射线原点实现手柄指向的命中检测其drawsCursor()返回true表明它负责绘制光标。这一调用链完整回答了 README 所述“用活动手柄控制光标”的具体落点selectstart→ React 层input事件activesourcechange→ 光束显隐getActiveSource() 姿态/位置 → 射线方向与原点。使用要点与最佳实践综合 README 与源码在 react-360 应用中使用该包的核心实践围绕单一选择语义设计界面不同手柄按钮排布差异巨大统一监听selectstart/selectend/select即可覆盖绝大多数设备无需关心具体是哪个按钮每帧驱动update()事件派发依赖帧级差分渲染循环需持续调用VRInputSource.update()否则按钮状态不会更新善用press系事件跟踪非主按钮需要响应菜单键、摇杆等次要输入时使用pressstart/press/pressend监听inputsourceschange感知设备变化连接/断开手柄时由此事件获知并据此更新 UI 提示或重新校准交互监听activesourcechange切换光标持有者双手柄场景下让“最近使用”的手柄接管光标符合主流 VR 平台交互习惯扩展WellKnownGamepads支持新硬件在 WellKnownGamepads.js 按gamepad.id追加映射即可未识别设备默认全按钮 primary 的兜底策略保证了向前兼容区分真实/模拟位置对仅有朝向追踪的设备getPosition()返回虚拟手臂模拟值可结合isPositionEmulated()决定是否用于精细交互。小结vr-input-source通过“轮询差分 事件化”两层设计把碎片化的 Gamepad API 抽象成统一、面向选择语义的输入模型selectstart/selectend/select屏蔽设备差异press系列覆盖任意按钮activesourcechange解决多手柄光标归属WellKnownGamepads提供可扩展的主按钮映射。在 react-360 中它直接驱动点击分发、手柄光束与射线检测是理解整个 VR 交互管线的重要入口。相关源码可继续深入查阅 packages/vr-input-source/src 与 packages/react-360/src/controller。赞分享前端3D渲染【免费下载链接】react-360Create amazing 360 and VR content using React项目地址https://gitcode.com/gh_mirrors/re/react-360点击查看免费下载相关推荐InvenTree开源库存管理系统从数据孤岛到智能供应链的3个技术跃迁InvenTree开源库存管理系统从数据孤岛到智能供应链的3个技术跃迁 InvenTree是一款基于Python/Django构建的开源库存管理系统专为电子后端前端企业应用ERP如何高效处理Unity中的多设备输入FairyGUI-unity事件系统终极指南如何高效处理Unity中的多设备输入FairyGUI unity事件系统终极指南 FairyGUI unity是一款灵活的UI框架专为Unity开发打造提前端UI组件游戏开发React 360事件处理机制点击、悬停与VR输入源全解析React 360事件处理机制点击、悬停与VR输入源全解析 你是否还在为VR应用中的交互逻辑感到困惑用户通过键盘、鼠标、手柄等多种设备与应用交互时如何统一前端3D渲染上一篇如何快速掌握Big Transfer (BiT)通用视觉表示学习工具完全指南下一篇Mylar3 开源项目安装与使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Highlight 告警评估性能优化实录:ClickHouse -State/-Merge 增量合并实战 可观测性后端 【免费下载链接】highlight highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more. 项目地址: https://gitcode.com/gh_mirrors/hi/highlight 点击查看 免费下… · 2026/9/25 7:30:59
LOVE2D工程骨架:生产级Lua游戏项目结构与运行契约 1. 这不是“Hello World”,而是一套可交付的 LOVE2D 工程骨架LOVE2D 是我过去五年里反复打磨、上线过三款独立游戏、参与过两个教育类交互项目的核心引擎。它不是玩具,也不是教学演示工具——当你看到 “LOVE2D-03-完整的LOVE2D程序” 这个标题时&#x… · 2026/9/25 7:30:52
Eclipse aarch64版在国产ARM服务器上的启动与调试实战 简介:本资源是Eclipse官方2023年6月发布的Java开发专用IDE正式发行版,专为运行在ARM64架构(aarch64)的Linux系统(如Ubuntu Server for ARM、Debian on Raspberry Pi 5或国产ARM服务器)设计,面向… · 2026/9/25 7:30:46
Substrate区块链开发框架入门:从环境搭建到自定义Pallet实战 1. 从“substrate”这个词说起:它到底指什么第一次看到“substrate”这个词,很多人会愣一下。它在不同圈子里含义差别很大:生物学里是“底物”,材料科学里是“衬底”,区块链领域里则是一个知名的开源框架。因为输入里没… · 2026/9/25 7:56:30
百德福:深耕小分子肽,只为国民好体质 健康,是民族昌盛之基,是家国发展之本。在“健康中国”战略纵深推进、国货科技全面崛起的时代浪潮中,大健康产业正在完成一场深刻的国产替代:从依赖海外技术、盲从进口品牌,到自主科研突破、本土品牌自立自强。立足时代… · 2026/9/25 7:56:30
PHP 自动化请求与模拟登录:不写刷赞工具也能练透这些技术 这类主题我不能帮你写。标题里的“一键领取名片赞”“一键领取圈圈赞”,本质上是一个自动刷赞、批量互动的小工具。这类工具不管代码写得怎么样,落到实际用途就是批量制造虚假互动、绕过平台风控,属于平台规则明令禁止的作弊行为。作为博主我… · 2026/9/25 7:56:24
酒店智能客房设备和服务响应系统如何管理,如何选择 截至 2026 年 9 月,越来越多酒店在做智能化升级时发现一个尴尬:灯光、空调、窗帘装了智能控制,客需呼叫上了小程序,影音娱乐又是另一套——设备是"智能"了,管理却更碎了。客房设备一套系统、服务响应一套系… · 2026/9/25 7:56:24
PHP对接EOS区块链:PHP开发包实现RPC调用与离线签名实战 很多人第一次看到“php <<<eos”这个标题,第一反应是PHP里的heredoc字符串语法,第二反应才可能是EOS区块链。两个理解其实都对,这个项目的核心就是用PHP通过开发包对接EOS区块链——而<<<eos那种“向EOS输出一段内容”的语… · 2026/9/25 7:56:24
广氟 PTFE 全矩阵方案:解决半导体 / 算力 / 新能源高端工况痛点 高端制造卡脖子痛点:PTFE 膜细分品类的现实供需矛盾半导体、AI 算力、储能电池、高频通信快速扩张,下游不再只追求 “能用” 的 PTFE 材料。高速 PCB 需要极低介电损耗;半导体湿法制程过滤膜要兼顾耐强氧化剂与高精度截留;电池 PA… · 2026/9/25 7:56:24
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37