XRReferenceSpace: getOffsetReferenceSpace() ã¡ã½ãã
å©ç¨å¯è½æ§ã¯éå®ç
ãã®æ©è½ã¯ãã¼ã¹ã©ã¤ã³ã§ã¯ããã¾ãããæãåºã使ç¨ããã¦ãããã©ã¦ã¶ã¼ã®ä¸é¨ã§åä½ãã¾ããã
Want more browser support for this feature? Tell us why.
å®å ¨ãªã³ã³ããã¹ãç¨: ãã®æ©è½ã¯ä¸é¨ã¾ãã¯ãã¹ã¦ã®å¯¾å¿ãã¦ãããã©ã¦ã¶ã¼ã«ããã¦ãå®å ¨ãªã³ã³ããã¹ã (HTTPS) ã§ã®ã¿å©ç¨ã§ãã¾ãã
XRReferenceSpace ã¤ã³ã¿ã¼ãã§ã¤ã¹ã® getOffsetReferenceSpace() ã¡ã½ããã¯ãã¡ã½ãããå¼ã³åºããããªãã¸ã§ã¯ã㨠3D 空éå
ã®ç¹å®ã®ç¹ã¨ã®éã®ä½ç½®ã®ç¸å¯¾çãªéããè¡¨ãæ°ããåç
§ç©ºéãªãã¸ã§ã¯ããè¿ãã¾ãã getOffsetReferenceSpace() ã«ãã£ã¦è¿ããããªãã¸ã§ã¯ãã¯ãXRReferenceSpace ã§å¼ã³åºãããå ´å㯠XRReferenceSpace ã§ãããXRBoundedReferenceSpace ã§å¼ã³åºãããå ´å㯠XRBoundedReferenceSpace ã§ãã
ã¤ã¾ãã3D 空éã«ãªãã¸ã§ã¯ãããããããã«å¯¾ãã¦å¥ã®ãªãã¸ã§ã¯ããç¸å¯¾çã«é
ç½®ããå¿
è¦ãããå ´åã¯ãgetOffsetReferenceSpace() ãå¼ã³åºãã¦ãgetOffsetReferenceSpace() ãå¼ã³åºããªãã¸ã§ã¯ãã®ä½ç½®ã¨åããåºæºã«ãã¦ã2 çªç®ã®ãªãã¸ã§ã¯ãã«æãããä½ç½®ã¨åããæ¸¡ãã¾ãã
次ã«ãã·ã¼ã³ãæç»ããã¨ãã«ããªãã»ããåç §ç©ºéã使ç¨ãã¦ããªãã¸ã§ã¯ããç¸äºã«ç¸å¯¾çã«é ç½®ããã ãã§ãªããå¿ è¦ãªå¤æãé©ç¨ãã¦ããã¥ã¼ã¢ã¼ã®ä½ç½®ã«åºã¥ãã¦ãªãã¸ã§ã¯ããé©åã«ã¬ã³ããªã³ã°ã§ãã¾ãã ããã¯ãé XR å ¥åã«åºã¥ãå転ã®å®è£ ã®ä¾ã§ç¤ºããã¦ãã¾ãã ãã®ä¾ã§ã¯ããã®æ¹æ³ã使ç¨ãã¦ãã¦ã¼ã¶ã¼ããã¦ã¹ã使ç¨ãã¦è¦éè§ããããããã³ã¨ã¼ã§ããããã«ããæ¹æ³ã示ãã¦ãã¾ãã
æ§æ
getOffsetReferenceSpace(originOffset)
弿°
originOffset-
æ°ããåç §ç©ºéã®åç¹ã¸ã®ãªãã»ãããæå®ãã
XRRigidTransformã ãããã®å¤ã¯ãç¾å¨ã®åç §ç©ºéã®ä½ç½®ã¨åãã«è¿½å ããããã®çµæã¯ãæ°ãã使ãããXRReferenceSpaceã®ä½ç½®ã¨åãã¨ãã¦ä½¿ç¨ããã¾ãã
è¿å¤
ã¡ã½ãããå¼ã³åºãããåç
§ç©ºéã¨åããã¤ãã£ãã®åç¹ãæã¤ãããªãã¸ã§ã¯ããã originOffset ã§æå®ãããç¹ã¾ã§ã®éããã示ãåç¹ãªãã»ãããæã¤åç
§ç©ºéãè¨è¿°ããæ°ãã XRReferenceSpace ãªãã¸ã§ã¯ãã§ãã
ãã®ã¡ã½ãããå¼ã³åºããªãã¸ã§ã¯ãã XRBoundedReferenceSpace ã®å ´åãè¿ããããªãã¸ã§ã¯ãã XRBoundedReferenceSpace ã§ãã æ°ããåç
§ç©ºéã® boundsGeometry ã«ã¯ãå
ã®ãªãã¸ã§ã¯ãã® boundsGeometry ãè¨å®ãããããããã®ç¹ã« originOffset ã®éè¡åï¼inverseï¼ãä¹ç®ããã¾ãã
ä¾
以ä¸ã¯ãgetOffsetReferenceSpace() ã®ä½¿ç¨æ¹æ³ã示ãããã¤ãã®ä¾ã§ãã
ãã¥ã¼ã¢ã¼ã®ãã¬ãã¼ãã¾ãã¯ä½ç½®ã®è¨å®
ã·ã¼ã³ãæåã«ä½æããã¨ãã«ã3D ä¸çå
ã§ã®ã¦ã¼ã¶ã¼ã®ä½ç½®ãè¨å®ããå¿
è¦ãããå ´åãããã¾ãã getOffsetReferenceSpace() ã使ç¨ãã¦ãããè¡ããã¨ãã§ãã¾ãã
xrSession.requestReferenceSpace("local").then((refSpace) => {
xrReferenceSpace = refSpace;
xrReferenceSpace = xrReferenceSpace.getOffsetReferenceSpace(
new XRRigidTransform(startPosition, { x: 0, y: 0, z: 1.0, w: 1.0 }),
);
xrSession.requestAnimationFrame(drawFrame);
});
ãã®ã³ã¼ãã§ã¯ããã¼ã«ã«åç
§ç©ºéãåå¾ããgetOffsetReferenceSpace() ã使ç¨ãã¦ãåç¹ã startPosition ã§æå®ãããä½ç½®ã«èª¿æ´ããåãã Z 軸ã«ç´ã«æ²¿ã£ãæ°ãã空éã使ãã¾ãã æ¬¡ã«ãXRSession ã® requestAnimationFrame() ã使ç¨ãã¦æåã®ã¢ãã¡ã¼ã·ã§ã³ãã¬ã¼ã ãè¦æ±ãã¾ãã
é XR å ¥åã«åºã¥ãå転ã®å®è£
WebXR ãç´æ¥ãµãã¼ããã¦ããå ¥åã³ã³ããã¼ã«ã¯ããã¹ã¦å°ç¨ã® VR ã¾ã㯠AR ã®å ¥åããã¤ã¹ã§ãã ãã¦ã¹ããã¼ãã¼ããã¾ãã¯ãã®ä»ã®å ¥åããã¤ã¹ã使ç¨ã㦠3D 空éå ã®ãªãã¸ã§ã¯ããç§»åã¾ãã¯å¤æããããã¦ã¼ã¶ã¼ã空éå ãç§»åã§ããããã«ããã«ã¯ãå ¥åãèªã¿åã£ã¦ç§»åããããã®ã³ã¼ããè¨è¿°ããå¿ è¦ãããã¾ãã
ããã¯ãgetOffsetReferenceSpace() ã®ãã 1 ã¤ã®è¯ãã¦ã¼ã¹ã±ã¼ã¹ã§ãã ãã®ä¾ã§ã¯ãã¦ã¼ã¶ã¼ããã¦ã¹ãå³ã¯ãªãã¯ããªããåãããã¨ã§ãè¦éè§ã®å¤æ´ã«ããå¨å²ãè¦åããã³ã¼ãã示ãã¾ãã
ã¾ããmousemove ã¤ãã³ãã®ã¤ãã³ããã³ãã©ã¼ã追å ãã¾ãã ããã¯ããã¦ã¹ã®å³ãã¿ã³ãæ¼ããã¦ããå ´åã«å転ãå®è¡ããã³ã¼ããå¼ã³åºãã¾ãã oncontextmenu ã¤ãã³ãã§ preventDefault() ãå¼ã³åºããã¨ã«ããããã®ã¤ãã³ããç¡è¦ãããããã«è¨å®ãã¦ãããã¨ã«ã注æãã¦ãã ããã ããã«ãããå³ã¯ãªãã¯ã«ãã£ã¦ã³ã³ããã¹ãã¡ãã¥ã¼ããã©ã¦ã¶ã¼ã«è¡¨ç¤ºãããªããªãã¾ãã
canvas.oncontextmenu = (event) => {
event.preventDefault();
};
canvas.addEventListener("mousemove", (event) => {
if (event.buttons & 2) {
rotateViewBy(event.movementX, event.movementY);
}
});
次ã«ãrotateViewBy() 颿°ã¯ãmousemove ã¤ãã³ãããã®ãã¦ã¹ãã«ã¿å¤ã«åºã¥ãã¦ããã¦ã¹ã«ãã¯ï¼mouse lookï¼æ¹åã®ã¨ã¼ã¨ããããæ´æ°ãã¾ãã ããããå¶éãã¦ãããããçä¸ã¨çä¸ãè¶
ãã¦è¦ããã¨ã¯ã§ãã¾ããã ãããå¼ã³åºããããã³ã«ãæ°ãããªãã»ããã使ç¨ãã¦ãmousePitch 㨠mouseYaw ã®ç¾å¨ã®å¤ãæ´æ°ããã¾ãã
let mouseYaw = 0.0;
let mousePitch = 0.0;
const inverseOrientation = quat.create();
const MOUSE_SPEED = 0.003;
function rotateViewBy(dx, dy) {
mouseYaw += dx * MOUSE_SPEED;
mousePitch += dy * MOUSE_SPEED;
if (mousePitch < -Math.PI * 0.5) {
mousePitch = -Math.PI * 0.5;
} else if (mousePitch > Math.PI * 0.5) {
mousePitch = Math.PI * 0.5;
}
}
æå¾ã«ãè¨ç®ããã¨ã¼ã¨ãããããã¥ã¼ã¢ã¼ã®åãã«å®éã«é©ç¨ããã³ã¼ããå¿
è¦ã§ãã ãã®é¢æ° applyMouseMovement() ã¯ã次ã®ãã¨ãå¦çãã¾ãã
function applyMouseMovement(refSpace) {
if (!mouseYaw && !mousePitch) {
return refSpace;
}
quat.identity(inverseOrientation);
quat.rotateX(inverseOrientation, inverseOrientation, -mousePitch);
quat.rotateY(inverseOrientation, inverseOrientation, -mouseYaw);
let newTransform = new XRRigidTransform(
{ x: 0, y: 0, z: 0 },
{
x: inverseOrientation[0],
y: inverseOrientation[1],
z: inverseOrientation[2],
w: inverseOrientation[3],
},
);
return refSpace.getOffsetReferenceSpace(newTransform);
}
ãã®é¢æ°ã¯ãç¾å¨ã®ãããå¤ã¨ã¨ã¼å¤ãããã¥ã¼ã¢ã¼ã®åããæ±ºããããã«ä½¿ç¨ããéåãè¡åã使ããnew XRRigidTransform() ãå¼ã³åºãã¨ãã«ãã®è¡åãåãã®ã½ã¼ã¹ã¨ãã¦ä½¿ç¨ãã¾ãã æ¬¡ã«ãæ°ãã XRRigidTransform ã®åç
§ç©ºéããã§ãããããå¼ã³åºãå
ã«è¿ããã¾ãã
ãã®æ°ããåç
§ç©ºéã¯ããã¥ã¼ã¢ã¼ã®ä½ç½®ã¯å¤æ´ãã¾ããããèç©ããããã¦ã¹å
¥åããçæããããããã¨ã¨ã¼ã®å¤ã«åºã¥ãã¦åãã夿´ãã¾ãã applyMouseMovement() ã¯ããã¬ã¼ã ãæç»ããã¨ãã«ãgetViewerPose() ã使ç¨ãã¦ãã¥ã¼ã¢ã¼ã®ãã¼ãºããã§ããããç´åã«å¼ã³åºãå¿
è¦ããããã¬ã³ããªã³ã°ã¯ãã®åç
§ç©ºéã§å®è¡ããå¿
è¦ãããã¾ãã
ããã«ä¼¼ãã³ã¼ãããç§»åãåããã¢ã¼ã·ã§ã³ã¨ãã WebXR ãã¥ã¼ããªã¢ã«ã®å¹ åºãè¨äºã§ä½¿ç¨ããã¦ããã®ãè¦ããã¨ãã§ãã¾ãã ç¹ã«ãWebXR ã»ãã·ã§ã³ã®éå§ã¨ããã»ã¯ã·ã§ã³ã確èªãã¦ãã ããã
仿§æ¸
| 仿§æ¸ |
|---|
| WebXR Device API > # dom-xrreferencespace-getoffsetreferencespace > |