å®å ¨ãªã³ã³ããã¹ãç¨: ãã®æ©è½ã¯ä¸é¨ã¾ãã¯ãã¹ã¦ã®å¯¾å¿ãã¦ãããã©ã¦ã¶ã¼ã«ããã¦ãå®å ¨ãªã³ã³ããã¹ã (HTTPS) ã§ã®ã¿å©ç¨ã§ãã¾ãã
ãã§ã« 3D ã°ã©ãã£ãã¯ã¹å ¨è¬ãç¹ã« WebGL ã«ç²¾éãã¦ããã¨æ³å®ããã¨ã次ã®å¤§èãªã¹ãããã§è¤åç¾å®ãå®ç¾ã§ãã¾ãã ç¾å®ã®ä¸çã«å ãã¦ãã¾ãã¯ãã®ä»£ããã«äººå·¥ã®é¢¨æ¯ããªãã¸ã§ã¯ãã表示ããã¨ããèãæ¹ã¯ãããã»ã©è¤éã§ã¯ããã¾ããã æ¡å¼µç¾å®ã¾ãã¯ä»®æ³ç¾å®ã®ã·ããªãªã®ã¬ã³ããªã³ã°ãéå§ããåã«ãWebXR ã»ãã·ã§ã³ã使ãã¦ã»ããã¢ããããå¿ è¦ãããã¾ãã ã¾ããé©åã«åæ¢ããæ¹æ³ãç¥ã£ã¦ããå¿ è¦ãããã¾ãã ãã®è¨äºã§ã¯ããããã®ãã¨ãè¡ãæ¹æ³ãå¦ã³ã¾ãã
WebXR API ã¸ã®ã¢ã¯ã»ã¹ã¢ããªã«ãã WebXR API ã¸ã®ã¢ã¯ã»ã¹ã¯ãXRSystem
ãªãã¸ã§ã¯ãããå§ã¾ãã¾ãã ãã®ãªãã¸ã§ã¯ãã¯ãã¦ã¼ã¶ã¼ã®æ©å¨ã§å©ç¨å¯è½ãªãã¼ãã¦ã§ã¢ã¨ãã©ã¤ãã¼ãéãã¦å©ç¨å¯è½ãª WebXR ããã¤ã¹ã¹ã¤ã¼ãå
¨ä½ã表ãã¾ãã Navigator
ã®ãããã㣠xr
ãä»ãã¦ããã¥ã¡ã³ãã§ä½¿ç¨ã§ããã°ãã¼ãã«ãª XRSystem
ãªãã¸ã§ã¯ããããã¾ãã ããã¯ã使ç¨å¯è½ãªãã¼ãã¦ã§ã¢ã¨ããã¥ã¡ã³ãã®ç°å¢ãèæ
®ãã¦ãé©å㪠XR ãã¼ãã¦ã§ã¢ã使ç¨ã§ããå ´åã« XRSystem
ãªãã¸ã§ã¯ããè¿ãããããã£ã§ãã
ãããã£ã¦ãXRSystem
ãªãã¸ã§ã¯ãããã§ããããæãåç´ãªã³ã¼ãã¯æ¬¡ã®ã¨ããã§ãã
WebXR ãå©ç¨ã§ããªãå ´åãxr
ã®å¤ã¯ null
ã¾ã㯠undefined
ã«ãªãã¾ãã
æ°ãããã¾ã éçºä¸ã® API ã¨ãã¦ãWebXR ã®ãµãã¼ãã¯ç¹å®ã®ããã¤ã¹ã¨ãã©ã¦ã¶ã¼ã«éå®ããã¦ãã¾ãã ããã¦ããããã§ãããããã©ã«ãã§æå¹ã«ãªããªãããããã¾ããã ãã ããäºææ§ã®ããã·ã¹ãã ããªãå ´åã§ããWebXR ã試ããã¨ãã§ãã鏿è¢ãããå ´åãããã¾ãã
WebXR ããªãã£ã«WebXR 仿§ãè¨è¨ãã¦ãããã¼ã ã¯ãWebXR API ããµãã¼ããã¦ããªããã©ã¦ã¶ã¼ã§ WebXR ãã·ãã¥ã¬ã¼ãããããã«ä½¿ç¨ã§ãã WebXR ããªãã£ã«ãå ¬éãã¦ãã¾ãã ãã©ã¦ã¶ã¼ãå¤ã WebVR API ããµãã¼ããã¦ããå ´åã¯ãããã使ç¨ããã¾ãã ãã以å¤ã®å ´åãããªãã£ã«ã¯ãGoogle ã® Cardboard VR API ã使ç¨ããå®è£ ã«ãã©ã¼ã«ããã¯ãã¾ãã
ããªãã£ã«ã¯ä»æ§ã¨ã¨ãã«ç¶æããã仿§ã«åããã¦ææ°ã«ä¿ããã¾ãã ããã«ãWebXR ããã³ WebXR ã«é¢é£ãããã®ä»ã®ãã¯ããã¸ã¼ã®ãµãã¼ãã¨ãããªãã£ã«ã®å¤æ´ã®å®è£ ã®çµæçãªãµãã¼ãã¨ãã¦ããã©ã¦ã¶ã¼ã¨ã®äºææ§ãç¶æããããã«æ´æ°ããã¾ãã
å¿ ã readme ãæ³¨ææ·±ãèªãã§ãã ããã ããªãã£ã«ã«ã¯ãã¿ã¼ã²ãããã©ã¦ã¶ã¼ã«å«ã¾ããæ°ãã JavaScript æ©è½ã¨ã®äºææ§ã®ç¨åº¦ã«å¿ãã¦ãããã¤ãã®ãã¼ã¸ã§ã³ãããã¾ãã
WebXR API ã¨ãã¥ã¬ã¼ã¿ã¼æ¡å¼µæ©è½Mozilla WebXR ãã¼ã ã¯ãWebXR API ãã¨ãã¥ã¬ã¼ãããHTC ViveãOculus GoãOculus QuestãSamsung GearãGoogle Cardboard ãªã©ã®äºææ§ã®ãããã¾ãã¾ãªããã¤ã¹ãã·ãã¥ã¬ã¼ããããFirefox 㨠Chrome ã®ä¸¡æ¹ã¨äºææ§ã®ãã WebXR API Emulator ãã©ã¦ã¶ã¼æ¡å¼µæ©è½ã使ãã¾ããã æ¡å¼µæ©è½ãé ç½®ããã¨ããããã»ããã¨ä»»æã®ãã³ãã³ã³ããã¼ã©ã¼ã®ä½ç½®ã¨åããããã³ã³ã³ããã¼ã©ã¼ã®ãã¿ã³ãå¶å¾¡ã§ããéçºè ãã¼ã«ããã«ãéããã¨ãã§ãã¾ãã
ã¨ãã¥ã¬ã¼ã¿ã¼ã®ä½¿ç¨å®éã®ãããã»ããã使ç¨ããã®ã«æ¯ã¹ã¦å°ãåä»ã§ãããããã«ãããWebXR ãé常å©ç¨ã§ããªããã¹ã¯ãããã³ã³ãã¥ã¼ã¿ã¼ã§ WebXR ã®ã³ã¼ãã試ãã¦éçºãããã¨ãã§ãã¾ãã ã¾ããã³ã¼ããå®éã®ããã¤ã¹ã«åãè¾¼ãåã«ãããã¤ãã®åºæ¬çãªãã¹ããå®è¡ã§ãã¾ãã ãã ããã¨ãã¥ã¬ã¼ã¿ã¼ã¯ã¾ã ãã¹ã¦ã® WebXR API ãå®å ¨ã«ã¨ãã¥ã¬ã¼ããã¦ããªããããäºæããªãåé¡ãçºçããå¯è½æ§ããããã¨ã«æ³¨æãã¦ãã ããã ããã§ããreadme ãã¡ã¤ã«ãæ³¨ææ·±ãèªã¿ãéå§ããåã«å¶éäºé ã確èªãã¦ãã ããã
éè¦: 製åããªãªã¼ã¹ã¾ãã¯åºè·ããåã«ã常ã«å®éã® AR ã VR ã®ãã¼ãã¦ã§ã¢ã§ã³ã¼ãããã¹ãããå¿ è¦ãããã¾ãã ã¨ãã¥ã¬ã¼ããã·ãã¥ã¬ã¼ã·ã§ã³ãã¾ãã¯ããªãã£ã«ãããç°å¢ã¯ãç©çããã¤ã¹ã§ã®å®éã®ãã¹ãã«ä»£ããé©åãªãã®ã§ã¯ããã¾ããã
æ¡å¼µæ©è½ã®åå¾ä»¥ä¸ã®ãµãã¼ãããã¦ãããã©ã¦ã¶ã¼ç¨ã® WebXR API ã¨ãã¥ã¬ã¼ã¿ã¼ããã¦ã³ãã¼ããã¦ãã ããã
æ¡å¼µæ©è½ã®ã½ã¼ã¹ã³ã¼ãã¯ãGitHub ã§å ¥æã§ãã¾ãã
ã¨ãã¥ã¬ã¼ã¿ã¼ã®åé¡ã¨ã¡ã¢ããã¯æ¡å¼µæ©è½ã«é¢ããå®å ¨ãªè¨äºã®å ´æã§ã¯ããã¾ããããè¨åãã価å¤ã®ããç¹å®ã®äºé ãããã¤ãããã¾ãã
æ¡å¼µæ©è½ã®ãã¼ã¸ã§ã³ 0.4.0 㯠2020 å¹´ 3 æ 26 æ¥ã«çºè¡¨ããã¾ããã å®å®ç¶æ ã«è¿ã¥ãã¦ãã WebXR AR ã¢ã¸ã¥ã¼ã«ã«ããæ¡å¼µç¾å®ï¼ARï¼ã®ãµãã¼ããå°å ¥ããã¾ããã AR ã®ããã¥ã¡ã³ãã¯ãè¿æ¥ä¸ã« MDN ã§å ¬éããã¾ãã
ãã®ä»ã®æ¹åã«ã¯ãã¨ãã¥ã¬ã¼ã¿ã¼ãæ´æ°ã㦠XR
ã¤ã³ã¿ã¼ãã§ã¤ã¹ã®ååã XRSystem
ã«å¤æ´ããã¹ã¯ã¤ã¼ãºï¼ã°ãªããï¼å
¥åã½ã¼ã¹ã®ãµãã¼ããå°å
¥ããXRInputSource
ã®ãããã㣠profiles
ã®ãµãã¼ãã追å ãã¾ãã
WebXR äºæç°å¢ã¯ãå®å
¨ã«ãã¼ããããããã¥ã¡ã³ãããå§ã¾ãã¾ãã ããã¥ã¡ã³ãã¯ããã¼ã«ã«ãã©ã¤ãï¼http://localhost/...
ãªã©ã® URL ã使ç¨ãããªã©ï¼ãããã¼ããããããã¼ã¸ã®ãã¼ãæã« HTTPS ã使ç¨ããå¿
è¦ãããã¾ãã åæ§ã«ãJavaScript ã³ã¼ãã¯å®å
¨ã«ãã¼ãããã¦ããå¿
è¦ãããã¾ãã
ããã¥ã¡ã³ããå®å
¨ã«ãã¼ããããªãã£ãå ´åã¯ãããã»ã©é ãã¾ã§å°éã§ãã¾ããã navigator.xr
ããããã£ã¯ãããã¥ã¡ã³ããå®å
¨ã«ãã¼ãããã¦ããªãå ´åã«ã¯åå¨ãã¾ããã ããã¯ãäºææ§ã®ãã XR ãã¼ãã¦ã§ã¢ãå©ç¨ã§ããªãå ´åã«ãå½ã¦ã¯ã¾ãã¾ãã ã©ã¡ãã®å ´åã§ããxr
ããããã£ã®æ¬ å¦ã«åããå¿
è¦ããããã¨ã©ã¼ãé©åã«å¦çããããä½ããã®å½¢å¼ã®ãã©ã¼ã«ããã¯ãæä¾ããå¿
è¦ãããã¾ãã
ãã©ã¼ã«ããã¯ã®é¸æè¢ã® 1 ã¤ã¯ãWebXR æ¨æºåããã»ã¹ãæ å½ãã Immersive Web ã¯ã¼ãã³ã°ã°ã«ã¼ãã«ãã£ã¦æä¾ããã WebXR ããªãã£ã«ã§ãã ããªãã£ã«ã¯ãWebXR ããã¤ãã£ãã§ãµãã¼ããã¦ããªããã©ã¦ã¶ã¼ã« WebXR ã®ãµãã¼ããæä¾ãããµãã¼ããã¦ãããã©ã¦ã¶ã¼ã®å®è£ éã®ä¸æ´åãè§£æ¶ãããããWebXR ããã¤ãã£ãã§å©ç¨ã§ããå ´åã§ãå½¹ç«ã¤å ´åãããã¾ãã
ããã§ã¯ãåã® <script>
ã¿ã°ã使ç¨ãã¦ããªãã£ã«ãå«ã¾ãã¦ãããã¾ãã¯ãã¼ãããã¦ããã¨æ³å®ãã¦ããªãã·ã§ã³ã§ããªãã£ã«ãã¤ã³ã¹ãã¼ã«ããå¾ã« XRSystem
ãªãã¸ã§ã¯ããè¿ã getXR()
颿°ãå®ç¾©ãã¾ãã
let webxrPolyfill = null;
function getXR(usePolyfill) {
let tempXR;
switch (usePolyfill) {
case "if-needed":
tempXR = navigator.xr;
if (!tempXR) {
webxrPolyfill = new WebXRPolyfill();
tempXR = webxrPolyfill;
}
break;
case "yes":
webxrPolyfill = new WebXRPolyfill();
tempXR = webxrPolyfill;
break;
case "no":
default:
tempXR = navigator.xr;
break;
}
return tempXR;
}
const xr = getXR("no"); // ãã¤ãã£ãã® XRSystem ãªãã¸ã§ã¯ããåå¾
const xr = getXR("yes"); // 常ã«ããªãã£ã«ãã XRSystem ãè¿ã
const xr = getXR("if-needed"); // navigator.xr ããªãå ´åã«ã®ã¿ããªãã£ã«ã使ç¨
è¿ããã XRSystem
ãªãã¸ã§ã¯ãã¯ãMDN ã§æä¾ããã¦ããããã¥ã¡ã³ãã«å¾ã£ã¦ä½¿ç¨ã§ãã¾ãã ã°ãã¼ãã«å¤æ° webxrPolyfill
ã¯ãããªãã£ã«ã¸ã®åç
§ãä¿æããããã«ã®ã¿ä½¿ç¨ãããä¸è¦ã«ãªãã¾ã§ããªãã£ã«ã使ç¨ã§ããããã«ãã¾ãã ããã null
ã«è¨å®ããã¨ãä¾åãã¦ãããªãã¸ã§ã¯ããããã使ç¨ããªããªã£ãã¨ãã«ãããªãã£ã«ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã§ãããã¨ã示ãã¾ãã
ãã¡ãããå¿ è¦ã«å¿ãã¦ãããç°¡ç¥åã§ãã¾ãã ã¢ããªã¯ããããããªãã£ã«ã使ç¨ãããã©ããã«ã¤ãã¦ãã¾ãè¡ãæ¥ããªãã®ã§ããããå¿ è¦ãªç¹å®ã®ã±ã¼ã¹ã«åç´åã§ãã¾ãã
権éã¨ã»ãã¥ãªãã£WebXR ãä¸å¿ã«å±éããå¤ãã®ã»ãã¥ãªãã£å¯¾çãããã¾ãã ã¾ããã¦ã¼ã¶ã¼ã®ä¸ç観ãå®å
¨ã«ç½®ãæãã immersive-vr
ã¢ã¼ãã使ç¨ããã«ã¯ãxr-spatial-tracking
æ©è½ããªã·ã¼ãè¨å®ããå¿
è¦ãããã¾ãã ããã«å ãã¦ãããã¥ã¡ã³ãã¯å®å
¨ã§ç¾å¨ãã©ã¼ã«ã¹ããã¦ããå¿
è¦ãããã¾ãã æå¾ã«ãclick
ã¤ãã³ãã®ãã³ãã©ã¼ãªã©ã®ã¦ã¼ã¶ã¼ã¤ãã³ããã³ãã©ã¼ãã requestSession()
ãå¼ã³åºãå¿
è¦ãããã¾ãã
å®å ¨ãª WebXR ã®æ´»åã¨ä½¿ç¨æ¹æ³ã®è©³ç´°ã«ã¤ãã¦ã¯ãWebXR ã®æ¨©éã¨ã»ãã¥ãªãã£ã®è¨äºãåç §ãã¦ãã ããã
å¿ è¦ãªã»ãã·ã§ã³ã¿ã¤ããå©ç¨å¯è½ã§ãããã¨ã®ç¢ºèªæ°ãã WebXR ã»ãã·ã§ã³ã使ããåã«ãã¦ã¼ã¶ã¼ã®ãã¼ãã¦ã§ã¢ã¨ã½ããã¦ã§ã¢ã使ç¨ããããã¬ã¼ã³ãã¼ã·ã§ã³ã¢ã¼ãããµãã¼ããã¦ãããã©ãããæåã«ç¢ºèªããã®ããã°ãã°è³¢æã§ãã ããã¯ããã¨ãã°ãæ²¡å ¥åãã¬ã¼ã³ãã¼ã·ã§ã³ã¨ã¤ã³ã©ã¤ã³ãã¬ã¼ã³ãã¼ã·ã§ã³ã®ã©ã¡ãã使ç¨ããããæ±ºå®ããããã«ã使ç¨ã§ãã¾ãã
ç¹å®ã®ã¢ã¼ãããµãã¼ãããã¦ãããã©ããã確èªããã«ã¯ãXRSystem
ã®ã¡ã½ãã isSessionSupported()
ãå¼ã³åºãã¾ãã ããã¯ãæå®ãããã¿ã¤ãã®ã»ãã·ã§ã³ã使ç¨ã§ããå ´å㯠true
ãããã§ãªãå ´å㯠false
ã«è§£æ±ºããã promise ãè¿ãã¾ãã
const immersiveOK = await navigator.xr.isSessionSupported("immersive-vr");
if (immersiveOK) {
// 没å
¥å VR ã»ãã·ã§ã³ã使ãã¦ä½¿ç¨ãã
} else {
// 代ããã«ã¤ã³ã©ã¤ã³ã»ãã·ã§ã³ã使ãããã
// ã¤ã³ã©ã¤ã³ãå¿
è¦ãªå ´åã¯éäºææ§ã«ã¤ãã¦ã¦ã¼ã¶ã¼ã«ä¼ãã¾ã
}
ã»ãã·ã§ã³ã®ä½æã¨éå§
WebXR ã»ãã·ã§ã³ã¯ XRSession
ãªãã¸ã§ã¯ãã«ãã£ã¦è¡¨ããã¾ãã XRSession
ãåå¾ããã«ã¯ãXRSystem
ã® requestSession()
ã¡ã½ãããå¼ã³åºãã¾ãã ãã®ã¡ã½ããã¯ãXRSession
ãæ£å¸¸ã«ç¢ºç«ã§ããå ´åã« XRSession
ã§è§£æ±ºãã promise ãè¿ãã¾ãã åºæ¬çã«ã¯ã次ã®ããã«ãªãã¾ãã
xr.requestSession("immersive-vr").then((session) => {
xrSession = session;
/* ã»ãã·ã§ã³ã®ã»ããã¢ãããç¶è¡ãã¾ã */
});
ãã®ã³ã¼ãã¹ããããã® requestSession()
ã«æ¸¡ããããã©ã¡ã¼ã¿ã¼ immersive-vr
ã«æ³¨æãã¦ãã ããã ãã®æååã¯ã確ç«ãã WebXR ã»ãã·ã§ã³ã®ã¿ã¤ããæå®ãã¾ãã ãã®å ´åã¯ãå®å
¨ã«æ²¡å
¥åã®ä»®æ³ç¾å®ä½é¨ã§ãã æ¬¡ã® 3 ã¤ã®é¸æè¢ãããã¾ãã
immersive-vr
ãããã»ããã¾ãã¯åæ§ã®ããã¤ã¹ã使ç¨ãããå®å ¨ã«æ²¡å ¥åã®ä»®æ³ç¾å®ã»ãã·ã§ã³ã ã¦ã¼ã¶ã¼ã®å¨ãã®ä¸çãããªããæç¤ºããç»åã§å®å ¨ã«ç½®ãæãã¾ãã
immersive-ar
ãããã»ããã¾ãã¯é¡ä¼¼ã®è£ ç½®ã使ç¨ãã¦ç»åãç¾å®ä¸çã«è¿½å ãããæ¡å¼µç¾å®ã»ãã·ã§ã³ã AR 仿§ã¯æµåçã§ããããããã®ãªãã·ã§ã³ã¯ã¾ã åºããµãã¼ãããã¦ãã¾ããã
inline
ããã¥ã¡ã³ãã¦ã£ã³ãã¦ã®ã³ã³ããã¹ãå ã§ã® XR ç»åã®ç»é¢è¡¨ç¤ºã
æ©è½ããªã·ã¼ããã®ä½¿ç¨ãç¦æ¢ããããã¦ã¼ã¶ã¼ããããã»ããã®ä½¿ç¨è¨±å¯ãæå¦ããããããªã©ãä½ããã®çç±ã§ã»ãã·ã§ã³ã使ã§ããªãã£ãå ´åãpromise ã¯æå¦ããã¾ãã ãããã£ã¦ãèµ·åã㦠WebXR ã»ãã·ã§ã³ãè¿ãããå®å ¨ãªé¢æ°ã¯æ¬¡ã®ããã«ãªãã¾ãã
async function createImmersiveSession(xr) {
try {
session = await xr.requestSession("immersive-vr");
return session;
} catch (error) {
throw error;
}
}
ãã®é¢æ°ã¯ãæ°ãã XRSession
ãè¿ãããã»ãã·ã§ã³ã®ä½æä¸ã«ã¨ã©ã¼ãçºçããå ´åã«ä¾å¤ãã¹ãã¼ãã¾ãã
表示ã¢ã¼ãã«å ãã¦ãrequestSession()
ã¡ã½ããã¯ãã»ãã·ã§ã³ãã«ã¹ã¿ãã¤ãºããããã®åæåãã©ã¡ã¼ã¿ã¼ãæã¤ãªãã·ã§ã³ã®ãªãã¸ã§ã¯ããåãã¾ãã ç¾å¨ãã»ãã·ã§ã³ã®æ§æå¯è½ãªå¯ä¸ã®å´é¢ã¯ãä¸çã®åº§æ¨ç³»ã表ãããã«ã©ã®åç
§ç©ºéã使ç¨ããå¿
è¦ããããã§ãã å¿
è¦ãªåç
§ç©ºéã¾ãã¯ä½¿ç¨ãããåç
§ç©ºéã¨äºææ§ã®ããã»ãã·ã§ã³ãåå¾ããããã«ãå¿
é ã¾ãã¯ãªãã·ã§ã³ã®åç
§ç©ºéãæå®ã§ãã¾ãã
ãã¨ãã°ãç¡å¶éï¼unbounded
ï¼ã®åç
§ç©ºéãå¿
è¦ãªå ´åã¯ãåå¾ããã»ãã·ã§ã³ã§ç¡å¶éã®ç©ºéã使ç¨ã§ããããã«ããããã«ããããå¿
é æ©è½ã¨ãã¦æå®ã§ãã¾ãã
async function createImmersiveSession(xr) {
try {
session = await xr.requestSession("immersive-vr", {
requiredFeatures: ["unbounded"],
});
return session;
} catch (error) {
throw error;
}
}
䏿¹ãã¤ã³ã©ã¤ã³ã»ãã·ã§ã³ãå¿
è¦ã§ããã¼ã«ã«ï¼local
ï¼åç
§ç©ºéã使ç¨ããå ´åã¯ã次ã®ããã«ãã¾ãã
async function createInlineSession(xr) {
try {
session = await xr.requestSession("inline", {
optionalFeatures: ["local"],
});
return session;
} catch (error) {
throw error;
}
}
ãã® createInlineSession()
颿°ã¯ããã¼ã«ã«åç
§ç©ºéã¨äºææ§ã®ããã¤ã³ã©ã¤ã³ã»ãã·ã§ã³ã使ãããã¨ãã¾ãã åç
§ç©ºéã使ããæºåãã§ãããããã¼ã«ã«ç©ºéã試ããã¨ãã§ãã¾ãã ããã失æããå ´åã¯ããã¹ã¦ã®ããã¤ã¹ããµãã¼ãããå¿
è¦ããããã¥ã¼ã¢ã¼ï¼viewer
ï¼åç
§ç©ºéã«ãã©ã¼ã«ããã¯ãã¾ãã
requestSession()
ã¡ã½ãããè¿ãã promise ãæ£å¸¸ã«è§£æ±ºãããã¨ã使ç¨å¯è½ãª WebXR ã»ãã·ã§ã³ãæä¸ã«ãããã¨ããããã¾ãã æ¬¡ã«ãã»ãã·ã§ã³ã使ç¨ã§ããããã«æºåããã¢ãã¡ã¼ã·ã§ã³ãéå§ã§ãã¾ãã
ã»ãã·ã§ã³ã®æ§æãå®äºããããã«å¿ è¦ãªï¼ã¾ãã¯å¿ è¦ã«ãªãå¯è½æ§ã®ããï¼ä¸»ãªãã¨ã¯ã次ã®ã¨ããã§ãã
end
ãå«ã¾ãããããã»ãã·ã§ã³ã®çµäºãæ¤åºã§ãã¾ããinputsourceschange
ã¤ãã³ããç£è¦ãã¦ãXR å
¥åã³ã³ããã¼ã©ã¼ã®è¿½å ã¾ãã¯åé¤ãããã³ãã¾ãã¾ãªé¸æããã³ã¹ã¯ã¤ã¼ãºã®ã¢ã¯ã·ã§ã³ã¤ãã³ããæ¤åºãã¾ããXRSystem
ã®ã¤ãã³ã devicechange
ãç£è¦ãã¦ãå©ç¨å¯è½ãªæ²¡å
¥åããã¤ã¹ã®ã»ããã夿´ãããã¨ãã«éç¥ãåãããã¨ãã§ãã¾ããHTMLCanvasElement
ã®ã¡ã½ãã getContext()
ãå¼ã³åºãã¦ããã¬ã¼ã ãã¬ã³ããªã³ã°ããäºå®ã®ãã£ã³ãã¹ã® WebGL ã³ã³ããã¹ããåå¾ãã¾ããXRWebGLLayer
ã使ããã»ãã·ã§ã³ã® renderState
ã®ãããã㣠baseLayer
ã«å¤ã渡ãã¦ãXR ã·ã¹ãã ã®ã½ã¼ã¹ã¨ã㦠WebGL ã³ã³ããã¹ããè¨å®ãã¾ããåºæ¬çãªå½¢å¼ã§ã¯ããã®æçµçãªã»ããã¢ãããè¡ãã³ã¼ãã¯æ¬¡ã®ããã«ãªãã¾ãã
async function runSession(session) {
let worldData;
session.addEventListener("end", onSessionEnd);
let canvas = document.querySelector("canvas");
gl = canvas.getContext("webgl", { xrCompatible: true });
// WebGL ãã¼ã¿ãªã©ãè¨å®ãã
worldData = loadGLPrograms(session, "worlddata.xml");
if (!worldData) {
return NULL;
}
// WebGL ã®æ§æãå®äºãã
worldData.session.updateRenderState({
baseLayer: new XRWebGLLayer(worldData.session, gl),
});
// ã·ã¼ã³ã®ã¬ã³ããªã³ã°ãéå§ãã¾ã
referenceSpace = await worldData.session.requestReferenceSpace("unbounded");
worldData.referenceSpace = referenceSpace.getOffsetReferenceSpace(
new XRRigidTransform(
worldData.playerSpawnPosition,
worldData.playerSpawnOrientation,
),
);
worldData.animationFrameRequestID =
worldData.session.requestAnimationFrame(onDrawFrame);
return worldData;
}
ãã®ä¾ã§ã¯ãworldData
ã¨ããååã®ãªãã¸ã§ã¯ãã使ãã¦ããã®ä¸çã¨ã¬ã³ããªã³ã°ç°å¢ã«é¢ãããã¼ã¿ãã«ãã»ã«åãã¾ãã ããã«ã¯ãXRSession
èªä½ãWebGL ã§ã·ã¼ã³ãã¬ã³ããªã³ã°ããããã«ä½¿ç¨ããããã¹ã¦ã®ãã¼ã¿ããã®ä¸çã®åç
§ç©ºéãããã³ requestAnimationFrame()
ã«ãã£ã¦è¿ããã ID ãå«ã¾ãã¾ãã
æåã«ãend
ã¤ãã³ãã®ãã³ãã©ã¼ãè¨å®ããã¾ãã æ¬¡ã«ãã¬ã³ããªã³ã°ãããã£ã³ãã¹ãåå¾ãããã® WebGL ã³ã³ããã¹ãã¸ã®åç
§ãåå¾ãã¦ãgetContext()
ãå¼ã³åºãã¨ãã« xrCompatible
ãªãã·ã§ã³ãæå®ãã¾ãã
次ã«ãWebGL ã¬ã³ãã©ã¼ã«å¿
è¦ãªãã¼ã¿ã¨ã»ããã¢ãããå®è¡ããã¦ãããWebGL ãç¬èªã®ãã¬ã¼ã ãããã¡ã¼ã¨ã㦠WebGL ã³ã³ããã¹ãã®ãã¬ã¼ã ãããã¡ã¼ã使ç¨ããããã«æ§æããã¾ãã ããã¯ãXRSession
ã®ã¡ã½ãã updateRenderState()
ã使ç¨ãã¦è¡ãããã¬ã³ããªã³ã°ç¶æ
ã® baseLayer
ããWebGL ã³ã³ããã¹ããã«ãã»ã«åããæ°ãã使ããã XRWebGLLayer
ã«è¨å®ãã¾ãã
ãã®æç¹ã§ãXRSession
èªä½ãå®å
¨ã«æ§æããã¦ãããããã¬ã³ããªã³ã°ãéå§ã§ãã¾ãã ã¾ãããã®ä¸çã®åº§æ¨ãè¨è¿°ãããåç
§ç©ºéãå¿
è¦ã§ãã XRSession
ã® requestReferenceSpace()
ã¡ã½ãããå¼ã³åºããã¨ã«ãããã»ãã·ã§ã³ã®åæåç
§ç©ºéãåå¾ã§ãã¾ãã requestReferenceSpace()
ãå¼ã³åºãã¨ãã«ãå¿
è¦ãªåç
§ç©ºéã®ã¿ã¤ãã®ååãæå®ãã¾ãã ãã®å ´åãunbounded
ã§ãã ãã¼ãºã«å¿ãã¦ãlocal
ã¾ã㯠viewer
ãç°¡åã«æå®ã§ãã¾ãã
ã¡ã¢: ãã¼ãºã«åã£ãé©åãªåç §ç©ºéã鏿ããæ¹æ³ãçè§£ããã«ã¯ãWebXR ã®å¹¾ä½å¦ã¨åç §ç©ºéã®åç §ç©ºéã¿ã¤ãã®é¸æãåç §ãã¦ãã ããã
requestReferenceSpace()
ã«ãã£ã¦è¿ãããåç
§ç©ºéã¯ãåç¹ (0, 0, 0) ã空éã®ä¸å¿ã«é
ç½®ãã¾ãã ããã¯ç´ æ´ããããã¨ã§ã â ãã¬ã¤ã¤ã¼ã®è¦ç¹ãä¸çã®æ£ç¢ºãªä¸å¿ããå§ã¾ãå ´åã¯ã ããããã»ã¨ãã©ã®å ´åãããã§ã¯ããã¾ããã ãã®å ´åã¯ãæåã®åç
§ç©ºéã§ getOffsetReferenceSpace()
ãå¼ã³åºãã¦ã(0, 0, 0) ããã¥ã¼ã¢ã¼ã®ä½ç½®ã«é
ç½®ãããããã«åº§æ¨ç³»ããªãã»ããããåæ§ã«é¡ãæã¾ããæ¹åã«ã·ããããæ°ããåç
§ç©ºéã使ãã¾ãã getOffsetReferenceSpace()
ã¸ã®å
¥åå¤ã¯ãããã©ã«ãã®ä¸ç座æ¨ã§æå®ããããã¬ã¼ã¤ã¼ã®ä½ç½®ã¨æ¹åãã«ãã»ã«åãã XRRigidTransform
ã§ãã
æ°ããåç
§ç©ºéãæä¸ã«ãããä¿ç®¡ããããã« worldData
ãªãã¸ã§ã¯ãã«æ ¼ç´ãããç¶æ
ã§ãã»ãã·ã§ã³ã® requestAnimationFrame()
ã¡ã½ãããå¼ã³åºãã¦ãWebXR ã»ãã·ã§ã³ã®ã¢ãã¡ã¼ã·ã§ã³ã®æ¬¡ã®ãã¬ã¼ã ãã¬ã³ããªã³ã°ããã¨ãã«ã³ã¼ã«ããã¯ãå®è¡ãããããã«ã¹ã±ã¸ã¥ã¼ã«ãã¾ãã æ»ãå¤ã¯ãå¿
è¦ã«å¿ãã¦å¾ã§ãªã¯ã¨ã¹ãããã£ã³ã»ã«ããããã«ä½¿ç¨ã§ãã ID ã§ãããããworldData
ã«ãä¿åãã¾ãã
æå¾ã«ãworldData
ãªãã¸ã§ã¯ããå¼ã³åºãå
ã«è¿ãããã¡ã¤ã³ã³ã¼ããå¾ã§å¿
è¦ãªãã¼ã¿ãåç
§ã§ããããã«ãªãã¾ãã ãã®æç¹ã§ãã»ããã¢ããããã»ã¹ãå®äºããã¢ããªã±ã¼ã·ã§ã³ã®ã¬ã³ããªã³ã°æ®µéã«å
¥ãã¾ããã ã¬ã³ããªã³ã°ã®è©³ç´°ã«ã¤ãã¦ã¯ãã¬ã³ããªã³ã°ã¨ WebXR ãã¬ã¼ã ã¢ãã¡ã¼ã·ã§ã³ã³ã¼ã«ããã¯ãåç
§ãã¦ãã ããã
æããã«ãããã¯ã»ãã®ä¸ä¾ã§ãã ãã¹ã¦ãä¿åããããã« worldData
ãªãã¸ã§ã¯ãã¯å¿
è¦ããã¾ããã ããªãã好ããªæ¹æ³ã§ç¶æããããã«å¿
è¦ãªæ
å ±ãä¿åã§ãã¾ãã å¥ã®æ
å ±ãå¿
è¦ã«ãªã£ãããå¥ã®ç¹å®ã®è¦ä»¶ãçºçããããã¦ãããã¯ããªããå¥ã®æ¹æ³ã§ãã¾ãã¯å¥ã®é åºã§ç©äºãè¡ãåå ã¨ãªãã¾ãã
åæ§ã«ãã¢ãã«ããã®ä»ã®æ å ±ãèªã¿è¾¼ãã ããWebGL ãã¼ã¿ï¼ãã¯ã¹ãã£ãé ç¹ãããã¡ã¼ãã·ã§ã¼ãã¼ãªã©ï¼ãè¨å®ãããããããã«ä½¿ç¨ããç¹å®ã®æ¹æ³ã¯ããã¼ãºã使ç¨ãã¦ãããã¬ã¼ã ã¯ã¼ã¯ã®ç¶æ³ãªã©ã«ãã£ã¦å¤§ããç°ãªãã¾ãã
éè¦ãªã»ãã·ã§ã³ç¶æã¤ãã³ãWebXR ã»ãã·ã§ã³ã®éç¨ã§ãã»ãã·ã§ã³ã®ç¶æ ã®å¤åã示ããã¾ãã¯ã»ãã·ã§ã³ãé©åã«åä½ããç¶ããããã«å¿ è¦ãªãã¨ãéç¥ããããã¤ãã®ã¤ãã³ãã®ãããããåãåãå ´åãããã¾ãã
ã»ãã·ã§ã³ã®å¯è¦ç¶æ ã®å¤åã®æ¤åºXRSession
ã®å¯è¦æ§ã®ç¶æ
ãå¤åããã¨ï¼ã»ãã·ã§ã³ãé表示ã¾ãã¯è¡¨ç¤ºãããã¨ããã¾ãã¯ã¦ã¼ã¶ã¼ãå¥ã®ã³ã³ããã¹ãã«ãã©ã¼ã«ã¹ããã¨ããªã©ï¼ãã»ãã·ã§ã³ã¯ visibilitychange
ã¤ãã³ããåãåãã¾ãã
session.onvisibilitychange = (event) => {
switch (event.session.visibilityState) {
case "hidden":
myFrameRate = 10;
break;
case "blurred-visible":
myFrameRate = 30;
break;
case "visible":
default:
myFrameRate = 60;
break;
}
};
ãã®ä¾ã§ã¯ãå¯è¦æ§ã®ç¶æ
ã«å¿ãã¦å¤æ° myFrameRate
ã夿´ãã¾ãã ãããããã¬ã³ãã©ã¼ã¯ãã®å¤ã使ç¨ãã¦ãã¢ãã¡ã¼ã·ã§ã³ã«ã¼ãã®é²è¡ã«å¿ãã¦æ°ãããã¬ã¼ã ãã¬ã³ããªã³ã°ããé »åº¦ãè¨ç®ãã¾ãã ãããã£ã¦ãã·ã¼ã³ã®ãã¼ããï¼blurredï¼ããå¤ããªãã»ã©ã¬ã³ããªã³ã°ã®é »åº¦ã¯ä½ããªãã¾ãã
ææãã¦ã¼ã¶ã¼ã®ä¸çã§ã®ä½ç½®ã追跡ãã¦ããã¨ãã«ããã¤ãã£ãã®åç¹ã«ä¸é£ç¶ã¾ãã¯ã¸ã£ã³ããçºçãããã¨ãããã¾ãã ãããçºçããæãä¸è¬çãªã·ããªãªã¯ãã¦ã¼ã¶ã¼ã XR ããã¤ã¹ã®åãã£ãªãã¬ã¼ã·ã§ã³ãè¦æ±ããã¨ããã¾ã㯠XR ãã¼ãã¦ã§ã¢ããåä¿¡ãã追跡ãã¼ã¿ã®æµãã«ä¸æçãªé害ãçºçããã¨ãã§ãã ãããã®ç¶æ³ã«ããããã¤ãã£ãã®åç¹ã¯ããã¤ãã£ãã®åç¹ãã¦ã¼ã¶ã¼ã®ä½ç½®ã¨åãã«åãããããã«å¿ è¦ãªè·é¢ã¨æ¹åã®è§åº¦ã§çªç¶ã¸ã£ã³ããã¾ãã
ãããçºçããã¨ãreset
ã¤ãã³ããã»ãã·ã§ã³ã® XRReferenceSpace
ã«éä¿¡ããã¾ãã ã¤ãã³ãã® transform
ããããã£ã¯ããã¤ãã£ãã®åç¹ãå調æ´ããããã«å¿
è¦ãªå¤æã詳述ãã XRRigidTransform
ã§ãã
ã¡ã¢: reset
ã¤ãã³ã㯠XRSession
ã§ã¯ãªã XRReferenceSpace
ã§çºçãããã¨ã«æ³¨æãã¦ãã ããã
reset
ã¤ãã³ãã®ãã 1 ã¤ã®ä¸è¬çãªåå ã¯ãå¶éä»ãåç
§ç©ºéï¼XRReferenceSpaceType
ã bounded-floor
ã§ããåç
§ç©ºéï¼ããXRBoundedReferenceSpace
ã®ãããã㣠boundsGeometry
ã®å¤æ´ã«ãã£ã¦æå®ãããã¸ãªã¡ããªãæã£ã¦ããå ´åã§ãã
åç
§ç©ºéã®ãªã»ããã®ããä¸è¬çãªåå ã¨ã詳細ããã³ãµã³ãã«ã³ã¼ãã«ã¤ãã¦ã¯ãreset
ã¤ãã³ãã®ããã¥ã¡ã³ããåç
§ãã¦ãã ããã
WebXR ã¯ãWebXR ã·ã¹ãã ã«åºæã®å
¥åã³ã³ããã¼ã«ã®ãªã¹ããä¿æãã¦ãã¾ãã ãããã®ããã¤ã¹ã«ã¯ããã³ããã«ãã³ã³ããã¼ã©ã¼ãã¢ã¼ã·ã§ã³ã»ã³ãµã¼ã«ã¡ã©ãã¢ã¼ã·ã§ã³ã»ã³ã·ãã£ãã°ãã¼ãããã®ä»ã®ãã£ã¼ãããã¯ããã¤ã¹ãªã©ãå«ã¾ãã¾ãã ã¦ã¼ã¶ã¼ã WebXR ã³ã³ããã¼ã©ã¼ããã¤ã¹ãæ¥ç¶ã¾ãã¯åæããã¨ãinputsourceschange
ã¤ãã³ãã XRSession
ã«ãã£ã¹ãããããã¾ãã ããã¯ãããã¤ã¹ã®å¯ç¨æ§ãã¦ã¼ã¶ã¼ã«éç¥ããæ©ä¼ã§ãããããã¤ã¹ã®å
¥åãç£è¦ãå§ããæ§æãªãã·ã§ã³ãæä¾ããããã¾ãã¯ããã使ç¨ããããã«å¿
è¦ãªãã®ãæä¾ãã¾ãã
ã¦ã¼ã¶ã¼ã® VR ã¾ã㯠AR ã»ãã·ã§ã³ãçµäºã«è¿ã¥ãã¨ãã»ãã·ã§ã³ã¯çµäºãã¾ãã XRSession
ã®åæ¢ã¯ãã¦ã¼ã¶ã¼ããã¿ã³ãã¯ãªãã¯ãã¦ã»ãã·ã§ã³ãçµäºããããã«åæ¢ããæã§ããã¨ã»ãã·ã§ã³èªä½ã夿ããå ´åï¼ã¦ã¼ã¶ã¼ã XR ããã¤ã¹ããªãã«ããå ´åãªã©ï¼ãã¾ãã¯ã¢ããªã±ã¼ã·ã§ã³ãç¶ãã¹ããã®ä»ã®ç¶æ³ã«å¿ãã¦çºçãã¾ãã
ããã§ã¯ãWebXR ã»ãã·ã§ã³ã®åæ¢ãè¦æ±ããæ¹æ³ã¨ãè¦æ±ã«ãããã©ããã«ããããããã»ãã·ã§ã³ãçµäºãããã¨ãæ¤åºããæ¹æ³ã®ä¸¡æ¹ã«ã¤ãã¦èª¬æãã¾ãã
ã»ãã·ã§ã³ã®åæ¢çµäºæã« WebXR ã»ãã·ã§ã³ãå®å
¨ã«åæ¢ããã«ã¯ãã»ãã·ã§ã³ã® end()
ã¡ã½ãããå¼ã³åºãå¿
è¦ãããã¾ãã ããã¯ã忢ããã¤å®äºããããç¥ãããã«ä½¿ç¨ã§ãã promise ãè¿ãã¾ãã
async function shutdownXR(session) {
if (session) {
await session.end();
/* ãã®æç¹ã§ãWebXR ã¯å®å
¨ã«åæ¢ãã¦ãã¾ã */
}
}
shutdownXR()
ãå¼ã³åºãå
ã«æ»ãã¨ãWebXR ã»ãã·ã§ã³ã¯å®å
¨ãã¤å®å
¨ã«åæ¢ãã¦ãã¾ãã
ãªã½ã¼ã¹ã®è§£æ¾ãªã©ãã»ãã·ã§ã³ã®çµäºæã«å®è¡ããå¿
è¦ããã使¥ãããå ´åã¯ãã¡ã¤ã³ã³ã¼ãæ¬ä½ã§ã¯ãªããend
ã¤ãã³ããã³ãã©ã¼ã§ãã®ä½æ¥ãå®è¡ããå¿
è¦ãããã¾ãã ãã®ããã«ãã¦ã忢ãèªåçã«ããªã¬ã¼ããããæåã§ããªã¬ã¼ããããã«é¢ä¿ãªããã¯ãªã¼ã³ã¢ãããå¦çãã¾ãã
以åã«ç¢ºç«ããããã«ãend()
ã¡ã½ãããå¼ã³åºããããã¦ã¼ã¶ã¼ããããã»ããããªãã«ããããXR ã·ã¹ãã ã§ä½ããã®è§£æ±ºã§ããªãã¨ã©ã¼ãçºçããããªã©ãXRSession
ã«éä¿¡ããã end
ã¤ãã³ããç£è¦ãããã¨ã§ãWebXR ã»ãã·ã§ã³ãçµäºãããã¨ãæ¤åºã§ãã¾ãã
session.onend = (event) => {
/* ã»ãã·ã§ã³ã忢ãã¾ãã */
freeResources();
};
ããã§ã¯ãã»ãã·ã§ã³ãçµäºããend
ã¤ãã³ããåä¿¡ãããã¨ãfreeResources()
颿°ãå¼ã³åºãããXR ã®æç¤ºãå¦çããããã«ä»¥åã«å²ãå½ã¦ãããã¼ãããããããªã½ã¼ã¹ãè§£æ¾ããã¾ãã end
ã¤ãã³ããã³ãã©ã¼ã§ freeResources()
ãå¼ã³åºããã¨ã«ãããã¦ã¼ã¶ã¼ã忢ãããªã¬ã¼ãããã¿ã³ãã¯ãªãã¯ããã¨ãï¼ä¸è¨ã® shutdownXR()
颿°ãå¼ã³åºããã¨ãªã©ï¼ã¨ãã¨ã©ã¼ã¾ãã¯ä½ããã®çç±ã§ã»ãã·ã§ã³ãèªåçã«çµäºããã¨ãã®ä¸¡æ¹ã§ freeResources()
ãå¼ã³åºãã¾ãã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4