XRRigidTransform: matrix 属性

可用性有限

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

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

只读的 XRRigidTransform 属性 matrix 返回由该对象表示的变换矩阵。然后,可以通过将此返回的矩阵与列向量预乘,来使向量在由 orientation 指定的 3D 旋转后进行旋转,再由 position 进行平移。

一个包含 16 个条目的 Float32Array,它表示由 positionorientation 属性描述的 4x4 变换矩阵。

用法说明

矩阵格式

WebGL 中使用的所有 4x4 变换矩阵都存储在 16 个元素的 Float32Array 中。值按列主序存储在数组中;也就是说,每个列从上到下写入数组,然后移动到下一列并将其写入数组。因此,对于数组 [a0, a1, a2, …, a13, a14, a15],矩阵如下所示:

[a0a4a8a12a1a5a9a13a2a6a10a14a3a7a11a15]\begin{bmatrix} a[0] & a[4] & a[8] & a[12]\\ a[1] & a[5] & a[9] & a[13]\\ a[2] & a[6] & a[10] & a[14]\\ a[3] & a[7] & a[11] & a[15]\\ \end{bmatrix}

首次请求时,会计算 matrix。在此之后,出于性能原因,它应该被缓存。

创建矩阵

在本节中,面向更高级的读者,我们将介绍 API 如何计算指定变换的矩阵。它首先分配一个新矩阵,并向其中写入一个 4x4 单位矩阵:

[1000010000100001]\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}

这是一个不会改变其应用的任何点、向量或对象的方向或位置的变换。

接下来,将 position 放置在最右边的列中,如下所示,从而得到一个平移矩阵,该矩阵将通过每个维度中的指定距离变换坐标系,而没有旋转变化。这里 pxpypzDOMPointReadOnly positionxyz 成员的值。

[100px010py001pz0001]\begin{bmatrix} 1 & 0 & 0 & x\\ 0 & 1 & 0 & y\\ 0 & 0 & 1 & z\\ 0 & 0 & 0 & 1 \end{bmatrix}

然后,通过从 orientation 指定的单位四元数计算列向量旋转矩阵来创建旋转矩阵:

[1-2(qy2+qz2)2(qxqy-qzqw)2(qxqz+qyqw)02(qxqy+qzqw)1-2(qx2+qz2)2(qyqz-qxqw)02(qxqz-qyqw)2(qyqz+qxqw)1-2(qx2+qy2)00001]\begin{bmatrix} 1 - 2(q_y^2 + q_z^2) & 2(q_xq_y - q_zq_w) & 2(q_xq_z + q_yq_w) & p_x\\ 2(q_xq_y + q_zq_w) & 1 - 2(q_x^2 + q_z^2) & 2(q_yq_z - q_xq_w) & p_y\\ 2(q_xq_z - q_yq_w) & 2(q_yq_z + q_xq_w) & 1 - 2(q_x^2 + q_y^2) & p_z\\ 0 & 0 & 0 & 1 \end{bmatrix}

最终的变换 matrix 是通过按 (translation * rotation) 的顺序将平移矩阵乘以旋转矩阵计算得出的。这将产生 matrix 返回的最终变换矩阵:

[1-2(qy2+qz2)2(qxqy-qzqw)2(qxqz+qyqw)px2(qxqy+qzqw)1-2(qx2+qz2)2(qyqz-qxqw)py2(qxqz-qyqw)2(qyqz+qxqw)1-2(qx2+qy2)pz0001]\begin{bmatrix} 1 - 2(q_y^2 + q_z^2) & 2(q_xq_y - q_zq_w) & 2(q_xq_z + q_yq_w) & p_x\\ 2(q_xq_y + q_zq_w) & 1 - 2(q_x^2 + q_z^2) & 2(q_yq_z - q_xq_w) & p_y\\ 2(q_xq_z - q_yq_w) & 2(q_yq_z + q_xq_w) & 1 - 2(q_x^2 + q_y^2) & p_z\\ 0 & 0 & 0 & 1 \end{bmatrix}

示例

在此示例中,创建了一个变换,用于生成一个矩阵,该矩阵可用作渲染 WebGL 对象时的变换,以便将对象放置到与给定偏移量和方向匹配的位置。然后将 matrix 传递给一个库函数,该函数使用 WebGL 使用指定的变换矩阵来渲染匹配给定名称的对象,以定位和定向它。

js
let transform = new XRRigidTransform(
  { x: 0, y: 0.5, z: 0.5 },
  { x: 0, y: -0.5, z: -0.5, w: 1 },
);
drawGLObject("magic-lamp", transform.matrix);

规范

规范
WebXR Device API
# dom-xrrigidtransform-matrix

浏览器兼容性