XRView:eye 属性

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

XRView 接口的只读 **eye** 属性是一个字符串,用于指示 XRView 代表哪只眼睛的视点:left(左眼)或 right(右眼)。对于不代表任何一只眼睛的视图,例如单眼视图,此属性的值为 none

一个可以为以下值之一的字符串

left

XRView 代表查看者的左眼视点。

该视图代表查看者的右眼。

none

XRView 描述的是一个单眼视图,或者该视图不代表任何一只眼睛的视点。

用法说明

此属性的主要目的是允许将任何预渲染立体内容(stereo content)的正确区域呈现给正确的眼睛。对于动态渲染的 3D 内容,您通常可以忽略此属性,并依次渲染查看者的每个视图。

示例

此代码来自查看器姿势 (viewer pose) 的渲染器,它会遍历姿势的视图并进行渲染。但是,我们有一些标志,如果为 true,则表示在游戏中某只眼睛受伤了。渲染该眼睛时,如果标志为 true,则跳过该视图而不进行渲染。

js
glLayer = xrSession.renderState.baseLayer;
gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer);
gl.clearColor(0, 0, 0, 1.0);
gl.clearDepth(1.0);
gl.clear(gl.COLOR_BUFFER_BIT, gl.DEPTH_BUFFER_BIT);

for (const view of xrPose.views) {
  let skipView = false;

  if (view.eye === "left" && body.leftEye.injured) {
    skipView = updateInjury(body.leftEye);
  } else if (view.eye === "right" && body.rightEye.injured) {
    skipView = updateInjury(body.rightEye);
  }

  if (!skipView) {
    let viewport = glLayer.getViewport(view);
    gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
    renderScene(gl, view);
  }
}

对于每个视图,都会检查 eye 的值,如果它为 leftright,我们就会检查 body.leftEye.injuredbody.rightEye.injured 属性是否为 true;如果是,我们就会在该眼睛上调用 updateInjury() 函数,以根据游戏需求执行诸如允许少量治愈、追踪中毒效果的进度等操作。

updateInjury() 返回 true 表示眼睛仍然受伤,或者返回 false 表示眼睛已通过该函数恢复健康。如果结果为 false(表示眼睛现在健康),我们则为该眼睛渲染场景。否则,不渲染。

规范

规范
WebXR Device API
# dom-xrview-eye

浏览器兼容性