探索 WebXR 的输入源,包括控制器和手部追踪,为全球用户创造引人入胜且直观的虚拟现实与增强现实体验。
WebXR 输入源:精通控制器与手部追踪,打造沉浸式体验
WebXR 提供了强大的工具,可直接在浏览器中创建沉浸式的虚拟现实和增强现实体验。任何沉浸式应用的一个关键方面是用户与虚拟世界的交互方式。WebXR 为各种输入源(主要是控制器和手部追踪)提供了强大的支持。了解如何利用这些输入方法对于为全球用户打造直观且引人入胜的体验至关重要。
理解 WebXR 输入源
在 WebXR 中,输入源代表用于与虚拟环境交互的物理设备或方法。这些输入源的范围可以从简单的游戏手柄式控制器到复杂的手部追踪系统。每个输入源都提供一个数据流,开发者可以用它来控制对象、导航场景以及在 XR 体验中触发动作。
输入源的类型
- 控制器: 用户手持和操作的带有按钮、摇杆、扳机和触摸板的物理设备。控制器是 VR 体验中一种常见且可靠的输入方法。
- 手部追踪: 使用摄像头和计算机视觉算法来检测和追踪用户在 3D 空间中的手部。这使得与虚拟环境的交互变得自然而直观。
- 其他输入源: 虽然不太常见,但 WebXR 也可支持其他输入源,如头部追踪(使用基于注视点的交互)和语音识别。
在 WebXR 中使用控制器
控制器是 WebXR 开发中一种受广泛支持且相对简单的输入源。它们在精度和易用性之间取得了平衡,使其适用于广泛的应用。
检测和访问控制器
WebXR API 提供了事件,用于在新输入源连接或断开时通知开发者。xr.session.inputsourceschange
事件是检测可用输入源变化的主要方式。
xrSession.addEventListener('inputsourceschange', (event) => {
// New input source connected
event.added.forEach(inputSource => {
console.log('New input source:', inputSource);
// Handle the new input source
});
// Input source disconnected
event.removed.forEach(inputSource => {
console.log('Input source removed:', inputSource);
// Handle the disconnected input source
});
});
一旦检测到输入源,您就可以访问其属性来确定其功能以及如何与之交互。inputSource.profiles
数组包含一个标准化配置文件的列表,描述了控制器的布局和功能。常见的配置文件包括 'generic-trigger'、'oculus-touch' 和 'google-daydream'。
获取控制器数据
要获取控制器的当前状态(例如,按钮按下、摇杆位置、扳机值),您需要使用 XRFrame.getControllerState()
方法。此方法返回一个 XRInputSourceState
对象,其中包含控制器当前的输入值。
xrSession.requestAnimationFrame(function onAnimationFrame(time, frame) {
const pose = frame.getViewerPose(xrReferenceSpace);
if (pose) {
const inputSources = xrSession.inputSources;
for (const inputSource of inputSources) {
if (inputSource.hand) continue; // Skip hand tracking
const inputSourceState = frame.getControllerState(inputSource);
if (inputSourceState) {
// Access button states
for (const button of inputSourceState.buttons) {
if (button.pressed) {
// Handle button press event
console.log('Button pressed:', button);
}
}
// Access axes values (e.g., joystick positions)
for (const axis of inputSourceState.axes) {
console.log('Axis value:', axis);
// Use axis value to control movement or other actions
}
//Access squeeze state (if available)
if (inputSourceState.squeeze != null) {
if(inputSourceState.squeeze.pressed) {
console.log("Squeeze pressed");
}
}
}
}
}
});
可视化控制器存在
向用户提供视觉反馈以指示其控制器在虚拟世界中的存在和位置至关重要。您可以通过创建控制器的 3D 模型,并根据控制器的姿态更新其位置和方向来实现这一点。
const inputSources = xrSession.inputSources;
for (const inputSource of inputSources) {
if (inputSource.hand) continue; // Skip hand tracking
const gripPose = frame.getPose(inputSource.gripSpace, xrReferenceSpace);
if (gripPose) {
// Update the controller model's position and rotation
controllerModel.position.set(gripPose.transform.position.x, gripPose.transform.position.y, gripPose.transform.position.z);
controllerModel.quaternion.set(gripPose.transform.orientation.x, gripPose.transform.orientation.y, gripPose.transform.orientation.z, gripPose.transform.orientation.w);
}
}
示例:基于控制器的交互 – 传送
控制器的一个常见用例是传送,它允许用户在虚拟环境中快速移动。以下是如何使用控制器扳机实现传送的简化示例:
// Check if the trigger button is pressed
if (inputSourceState.buttons[0].pressed) {
// Perform teleportation logic
const targetPosition = calculateTeleportLocation();
xrReferenceSpace = xrSession.requestReferenceSpace('local-floor', { position: targetPosition });
}
在 WebXR 中运用手部追踪的力量
与控制器相比,手部追踪提供了一种更自然、更直观的交互方法。它允许用户使用自己的双手直接操纵虚拟对象、做出手势并与环境互动。
启用手部追踪
手部追踪需要在创建 WebXR会话时请求 'hand-tracking'
可选功能。
navigator.xr.requestSession('immersive-vr', {
requiredFeatures: [],
optionalFeatures: ['hand-tracking']
}).then(session => {
xrSession = session;
// ...
});
访问手部数据
一旦启用手部追踪,您就可以通过 inputSource.hand
属性访问手部数据。此属性返回一个 XRHand
对象,代表用户的手。XRHand
对象提供了访问手中关节(如指尖、指关节和手掌)位置和方向的方法。
xrSession.requestAnimationFrame(function onAnimationFrame(time, frame) {
const pose = frame.getViewerPose(xrReferenceSpace);
if (pose) {
const inputSources = xrSession.inputSources;
for (const inputSource of inputSources) {
if (!inputSource.hand) continue; // Skip controllers
// Get the XRHand object
const hand = inputSource.hand;
// Iterate through the joints of the hand
for (let i = 0; i < hand.length; i++) {
const jointSpace = hand[i];
// Get the pose of the joint
const jointPose = frame.getPose(jointSpace, xrReferenceSpace);
if (jointPose) {
// Access the joint's position and orientation
const jointPosition = jointPose.transform.position;
const jointOrientation = jointPose.transform.orientation;
// Update the position and rotation of a 3D model representing the joint
jointModels[i].position.set(jointPosition.x, jointPosition.y, jointPosition.z);
jointModels[i].quaternion.set(jointOrientation.x, jointOrientation.y, jointOrientation.z, jointOrientation.w);
}
}
}
}
});
可视化手部存在
与控制器类似,向用户提供视觉反馈以在虚拟世界中呈现他们的手至关重要。您可以通过创建手的 3D 模型并根据手部追踪数据更新其位置和方向来实现。或者,您也可以使用更简单的可视化方式,如球体或立方体来表示关节位置。
示例:基于手部的交互 – 抓取对象
手部追踪最常见、最直观的用例之一是抓取和操纵虚拟对象。以下是如何使用手部追踪实现对象抓取的简化示例:
// Check if a finger is close to an object
if (distanceBetweenFingerAndObject < threshold) {
// Grab the object
grabbedObject = object;
grabbedObject.parent = handJointModel; // Attach the object to the hand
}
// When the finger moves away from the object
if (distanceBetweenFingerAndObject > threshold) {
// Release the object
grabbedObject.parent = null; // Detach the object from the hand
// Apply velocity to the object based on the hand's movement
grabbedObject.velocity.set(handVelocity.x, handVelocity.y, handVelocity.z);
}
WebXR 输入开发的最佳实践
为了创建引人入胜且用户友好的 WebXR 体验,遵循以下最佳实践非常重要:
- 提供清晰的视觉反馈: 始终向用户提供视觉反馈,以指示其输入设备(控制器或手)的存在和状态。
- 优先考虑直观交互: 设计让用户感觉自然和直观的交互。考虑将手部追踪用于涉及直接操纵的任务,将控制器用于需要更高精度或复杂控制的任务。
- 优化性能: 手部追踪和控制器输入可能会占用大量性能。优化您的代码以最大限度地减少延迟,并确保流畅和响应迅速的体验。考虑使用对象池和 LOD(细节层次)等技术来提高性能。
- 高效处理输入事件: 避免在输入事件处理程序中直接执行昂贵的操作。相反,将输入事件排队,并在单独的线程中或使用 requestAnimationFrame 来处理它们,以避免阻塞主渲染线程。
- 支持多种输入源: 为无法使用手部追踪或特定类型控制器的用户提供后备机制。考虑允许用户根据自己的偏好和可用硬件在不同的输入方法之间切换。
- 可访问性: 在设计 XR 体验时要考虑到可访问性。为残障用户提供替代输入方法,如语音控制或基于注视点的交互。确保所有交互都通过视觉和听觉提示清晰地传达。
输入设计的全球化考量
在为全球用户设计 WebXR 体验时,考虑文化差异和可访问性要求非常重要。以下是一些需要牢记的关键因素:
- 手势识别的文化差异: 手势在不同文化中可能有不同的含义。避免使用在某些地区可能具有攻击性或被误解的手势。考虑提供替代的交互方法或允许用户自定义手势映射。例如,竖起大拇指的手势在许多西方文化中是积极的,但在中东和南美洲的某些地区可能具有攻击性。
- 手的大小和形状差异: 手部追踪算法可能需要进行调整,以适应不同人群手的大小和形状的变化。提供校准选项,允许用户根据自己的特定手部特征微调手部追踪。
- 语言和本地化: 确保所有文本和音频提示都针对不同语言进行了适当的本地化。考虑使用基于图标的界面,以最大限度地减少文本本地化的需求。
- 残障用户的可访问性: 从一开始就考虑到可访问性来设计您的 XR 体验。为残障用户提供替代输入方法,如语音控制、基于注视点的交互或开关访问。确保所有交互都通过视觉和听觉提示清晰地传达。考虑提供自定义文本和图标大小与颜色的选项,以提高可见性。
- 硬件可用性和成本: 注意不同地区 XR 硬件的可用性和成本。设计您的体验,使其与一系列设备兼容,包括低端移动 VR 头显和支持增强现实的智能手机。
结论
精通 WebXR 输入源(包括控制器和手部追踪)对于创建引人入胜且直观的沉浸式体验至关重要。通过了解每种输入方法的功能并遵循交互设计的最佳实践,您可以打造出对全球用户具有吸引力、易于访问且充满乐趣的 XR 应用。随着 WebXR 技术的不断发展,我们可以期待看到更复杂的输入方法出现,进一步模糊物理世界和虚拟世界之间的界限。
通过关注用户交互的细节并采纳这些最佳实践,开发者可以创造出真正沉浸式、直观且全球用户都能访问的 WebXR 体验。XR 的未来是光明的,通过专注于深思熟虑和以用户为中心的设计,我们可以释放这项变革性技术的全部潜力。