WebXRå¹³é¢ã¡ãã·ã¥çæãæ·±ãæãäžããåçãªãµãŒãã§ã¹ãžãªã¡ããªäœææè¡ãšã倿§ãªãã©ãããã©ãŒã ã§ã®æ²¡å ¥åARäœéšæ§ç¯ãæ¢æ±ããŸãã
WebXRå¹³é¢ã¡ãã·ã¥çæïŒæ²¡å ¥åäœéšã®ããã®ãµãŒãã§ã¹ãžãªã¡ããªäœæ
WebXRã¯ãæ¡åŒµçŸå®ïŒARïŒããã³ä»®æ³çŸå®ïŒVRïŒäœéšãçŽæ¥ãŠã§ããã©ãŠã¶ã«ããããããšã§ãããžã¿ã«äžçãšã®ã€ã³ã¿ã©ã¯ã·ã§ã³æ¹æ³ã«é©åœããããããŠããŸããWebXRã§é åçãªARã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§åºæ¬çãªåŽé¢ã¯ãçŸå®äžçã®ãµãŒãã§ã¹ãã3Dã¡ãã·ã¥ãæ€åºãäœæããèœåã§ãããããã«ããä»®æ³ãªããžã§ã¯ãããŠãŒã¶ãŒã®ç°å¢ãšã·ãŒã ã¬ã¹ã«çµ±åã§ããããã«ãªããŸãããã®ããã»ã¹ã¯å¹³é¢ã¡ãã·ã¥çæãšããŠç¥ãããŠããããã®å æ¬çãªã¬ã€ãã®çŠç¹ãšãªããŸãã
WebXRã«ããã平颿€åºã®çè§£
ã¡ãã·ã¥ãçæããåã«ãWebXRãçŸå®äžçã®å¹³é¢ãã©ã®ããã«æ€åºããããçè§£ããå¿
èŠããããŸãããã®æ©èœã¯ãXRPlaneSetã€ã³ã¿ãŒãã§ã€ã¹ãéããŠæäŸãããXRFrame.getDetectedPlanes()ã¡ãœããããã¢ã¯ã»ã¹ã§ããŸããåºç€ãšãªããã¯ãããžãŒã¯ã³ã³ãã¥ãŒã¿ããžã§ã³ã¢ã«ãŽãªãºã ã«äŸåããŠããããã°ãã°ãŠãŒã¶ãŒã®ããã€ã¹ã®ã»ã³ãµãŒããŒã¿ïŒäŸïŒã«ã¡ã©ãå é床èšããžã£ã€ãã¹ã³ãŒãïŒã掻çšããŠå¹³åŠãªãµãŒãã§ã¹ãç¹å®ããŸãã
äž»èŠãªæŠå¿µïŒ
- XRPlaneïŒãŠãŒã¶ãŒã®ç°å¢ã§æ€åºãããå¹³é¢ã衚ããŸããå¹³é¢ã®ãžãªã¡ããªãããŒãºããã©ããã³ã°ç¶æ ã«é¢ããæ å ±ãæäŸããŸãã
- XRPlaneSetïŒçŸåšã®ãã¬ãŒã ã§æ€åºããã
XRPlaneãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ã§ãã - ãã©ããã³ã°ç¶æ ïŒæ€åºãããå¹³é¢ã®ä¿¡é Œæ§ã瀺ããŸããã·ã¹ãã ãããå€ãã®ããŒã¿ãåéããŠããéãå¹³é¢ã¯äžæçã«ãäžæçãç¶æ ã«ãªãããšãããããã©ããã³ã°ãå®å®ãããšæçµçã«ããã©ããã³ã°äžãç¶æ ã«ç§»è¡ããŸãã
å®è·µçãªäŸïŒ
ãŠãŒã¶ãŒãWebXR ARã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠã¹ããŒããã©ã³ã«ã¡ã©è¶ãã«ãªãã³ã°ã«ãŒã ãèŠãŠããã·ããªãªãèããŠã¿ãŸããããã¢ããªã±ãŒã·ã§ã³ã¯å¹³é¢æ€åºã䜿çšããŠãä»®æ³ãªããžã§ã¯ããé
眮ããããã®æœåšçãªãµãŒãã§ã¹ãšããŠãåºãå£ãã³ãŒããŒããŒãã«ãç¹å®ããŸãããããã®æ€åºããããµãŒãã§ã¹ã¯ãXRPlaneSetå
ã®XRPlaneãªããžã§ã¯ããšããŠè¡šãããŸãã
å¹³é¢ã¡ãã·ã¥äœæã®æ¹æ³
å¹³é¢ãæ€åºããããæ¬¡ã®ã¹ãããã¯ãããã®ãµãŒãã§ã¹ã衚ã3Dã¡ãã·ã¥ãçæããããšã§ããåçŽãªé·æ¹åœ¢ã¡ãã·ã¥ãããããè€éã§åçã«æŽæ°ãããã¡ãã·ã¥ãŸã§ãããã€ãã®æ¹æ³ã䜿çšã§ããŸãã
1. åçŽãªé·æ¹åœ¢ã¡ãã·ã¥
æãåçŽãªã¢ãããŒãã¯ãæ€åºãããå¹³é¢ãè¿äŒŒããé·æ¹åœ¢ã¡ãã·ã¥ãäœæããããšã§ããããã«ã¯ãå¹³é¢ã®å¢çã®é ç¹ãæäŸããXRPlaneã®polygonããããã£ã䜿çšããŸãããããã®é ç¹ã䜿çšããŠãé·æ¹åœ¢ã®è§ãå®çŸ©ã§ããŸãã
ã³ãŒãäŸïŒThree.jsã䜿çšïŒïŒ
// 'plane'ã¯XRPlaneãªããžã§ã¯ãã§ãããšä»®å®ããŸã
const polygon = plane.polygon;
const vertices = polygon.flatMap(point => [point.x, point.y, point.z]);
// å¢çé·æ¹åœ¢ãäœæããããã«ãæå°ããã³æå€§Xããã³Zå€ãæ€çŽ¢ããŸã
let minX = Infinity;
let maxX = -Infinity;
let minZ = Infinity;
let maxZ = -Infinity;
for (let i = 0; i < vertices.length; i += 3) {
minX = Math.min(minX, vertices[i]);
maxX = Math.max(maxX, vertices[i]);
minZ = Math.min(minZ, vertices[i + 2]);
maxZ = Math.max(maxZ, vertices[i + 2]);
}
const width = maxX - minX;
const height = maxZ - minZ;
const geometry = new THREE.PlaneGeometry(width, height);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00, side: THREE.DoubleSide });
const mesh = new THREE.Mesh(geometry, material);
// å¹³é¢ã®ããŒãºã«ã¡ãã·ã¥ãé
眮ããŸã
const pose = frame.getPose(plane.planeSpace, xrReferenceSpace);
if (pose) {
mesh.position.set(pose.transform.position.x, pose.transform.position.y, pose.transform.position.z);
mesh.quaternion.set(pose.transform.orientation.x, pose.transform.orientation.y, pose.transform.orientation.z, pose.transform.orientation.w);
}
scene.add(mesh);
å©ç¹ïŒ
- å®è£ ã容æã§ãã
- èšç®ã³ã¹ããäœãã§ãã
æ¬ ç¹ïŒ
- ç¹ã«é·æ¹åœ¢ã§ãªãå Žåãå¹³é¢ã®çã®åœ¢ç¶ãæ£ç¢ºã«è¡šããªãå ŽåããããŸãã
- å¹³é¢å¢çã®å€æŽïŒäŸïŒå¹³é¢ã粟緻åãŸãã¯ãªã¯ã«ãŒãžã§ã³ãããå ŽåïŒãåŠçããŸããã
2. ããªãŽã³ããŒã¹ã®ã¡ãã·ã¥
ããæ£ç¢ºãªã¢ãããŒãã¯ãæ€åºãããå¹³é¢ã®ããªãŽã³ã«å¯æ¥ã«åŸãã¡ãã·ã¥ãäœæããããšã§ããããã«ã¯ãããªãŽã³ã®äžè§æž¬éãšãçµæã®äžè§åœ¢ããã¡ãã·ã¥ãäœæããããšãå«ãŸããŸãã
äžè§æž¬éïŒ
äžè§æž¬éã¯ãããªãŽã³ãäžè§åœ¢ã®ã»ããã«åå²ããããã»ã¹ã§ããè³åãæ³ãããããŒäžè§æž¬éæ³ãªã©ãããã€ãã®ã¢ã«ãŽãªãºã ãäžè§æž¬éã«äœ¿çšã§ããŸããEarcutã®ãããªã©ã€ãã©ãªã¯ãJavaScriptã§ã®å¹ççãªäžè§æž¬éã«äžè¬çã«äœ¿çšãããŸãã
ã³ãŒãäŸïŒThree.jsãšEarcutã䜿çšïŒïŒ
import Earcut from 'earcut';
// 'plane'ã¯XRPlaneãªããžã§ã¯ãã§ãããšä»®å®ããŸã
const polygon = plane.polygon;
const vertices = polygon.flatMap(point => [point.x, point.y, point.z]);
// Earcutã®ããã«é ç¹ã1次å
é
åã«ãã©ããåããŸã
const flattenedVertices = polygon.flatMap(point => [point.x, point.z]); // å¹³é¢ã®å ŽåYã¯0ãšä»®å®ãããŸã
// Earcutã䜿çšããŠããªãŽã³ãäžè§æž¬éããŸã
const triangles = Earcut(flattenedVertices, null, 2); // 2ã¯é ç¹ããã2ã€ã®å€ïŒxãzïŒã瀺ããŸã
const geometry = new THREE.BufferGeometry();
// ã¡ãã·ã¥ã®é ç¹ãã€ã³ããã¯ã¹ãæ³ç·ãäœæããŸã
const positions = new Float32Array(vertices);
const indices = new Uint32Array(triangles);
geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
g'eometry.setIndex(new THREE.BufferAttribute(indices, 1));
g'eometry.computeVertexNormals();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00, side: THREE.DoubleSide });
const mesh = new THREE.Mesh(geometry, material);
// å¹³é¢ã®ããŒãºã«ã¡ãã·ã¥ãé
眮ããŸã
const pose = frame.getPose(plane.planeSpace, xrReferenceSpace);
if (pose) {
mesh.position.set(pose.transform.position.x, pose.transform.position.y, pose.transform.position.z);
mesh.quaternion.set(pose.transform.orientation.x, pose.transform.orientation.y, pose.transform.orientation.z, pose.transform.orientation.w);
}
scene.add(mesh);
å©ç¹ïŒ
- æ€åºãããå¹³é¢ã®åœ¢ç¶ãããæ£ç¢ºã«è¡šããŸãã
æ¬ ç¹ïŒ
- åçŽãªé·æ¹åœ¢ã¡ãã·ã¥ãããå®è£ ãè€éã§ãã
- äžè§æž¬éã©ã€ãã©ãªãå¿ èŠã§ãã
- å¹³é¢å¢çã®å€æŽãå®å šã«åŠçããªãå ŽåããããŸãã
3. åçãªã¡ãã·ã¥æŽæ°
WebXRã·ã¹ãã ãç°å¢ã®çè§£ã粟緻åããã«ã€ããŠãæ€åºãããå¹³é¢ã¯æéãšãšãã«å€åããå¯èœæ§ããããŸããå¹³é¢ã®å¢çã¯ãããå€ãã®é åãæ€åºãããã«ã€ããŠæé·ããå¯èœæ§ããããå¹³é¢ã®äžéšããªã¯ã«ãŒãžã§ã³ããããšçž®å°ããå¯èœæ§ããããŸããçŸå®äžçã®æ£ç¢ºãªè¡šçŸãç¶æããããã«ã¯ãå¹³é¢ã¡ãã·ã¥ãåçã«æŽæ°ããããšãäžå¯æ¬ ã§ãã
å®è£ ïŒ
- åãã¬ãŒã ã§ã
XRPlaneSetãå埩åŠçããåå¹³é¢ã®çŸåšã®ããªãŽã³ãåã®ããªãŽã³ãšæ¯èŒããŸãã - ããªãŽã³ãå€§å¹ ã«å€æŽãããå Žåã¯ãã¡ãã·ã¥ãåçæããŸãã
- 軜埮ãªå€æŽã®ããã«ã¡ãã·ã¥ãäžå¿ èŠã«åçæããããšãé¿ããããã«ããããå€ã®äœ¿çšãæ€èšããŠãã ããã
äŸïŒ
ARããã€ã¹ãæã£ãŠéšå±ãæ©ãåããŠãŒã¶ãŒãæ³åããŠãã ããã圌ããç§»åãããšãWebXRã·ã¹ãã ã¯åºãããå€ãæ€åºããå¯èœæ§ããããåºå¹³é¢ãæ¡å€§ããŸãããã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯åºã¡ãã·ã¥ãæŽæ°ããŠãå¹³é¢ã®æ°ããå¢çãåæ ããå¿ èŠããããŸããéã«ããŠãŒã¶ãŒãåºã«ãªããžã§ã¯ãã眮ããŠå¹³é¢ã®äžéšããªã¯ã«ãŒãžã§ã³ããå Žåãåºå¹³é¢ãçž®å°ããå¥ã®ã¡ãã·ã¥æŽæ°ãå¿ èŠã«ãªãå¯èœæ§ããããŸãã
ããã©ãŒãã³ã¹ã®ããã®å¹³é¢ã¡ãã·ã¥çæã®æé©å
å¹³é¢ã¡ãã·ã¥çæã¯ãç¹ã«åçãªã¡ãã·ã¥æŽæ°ã䌎ãå Žåãèšç®è² è·ãé«ããªãå¯èœæ§ããããŸããã¹ã ãŒãºã§å¿çæ§ã®é«ãARäœéšã確ä¿ããããã«ãããã»ã¹ãæé©åããããšãäžå¯æ¬ ã§ãã
æé©åæè¡ïŒ
- ãã£ãã·ã¥ïŒçæãããã¡ãã·ã¥ããã£ãã·ã¥ããå¹³é¢ã®ãžãªã¡ããªãå€§å¹ ã«å€æŽãããå Žåã«ã®ã¿åçæããŸãã
- LODïŒè©³çŽ°åºŠïŒïŒãŠãŒã¶ãŒããã®è·é¢ã«åºã¥ããŠãå¹³é¢ã¡ãã·ã¥ã«ç°ãªã詳现床ã¬ãã«ã䜿çšããŸããé ãã®å¹³é¢ã«ã¯åçŽãªé·æ¹åœ¢ã¡ãã·ã¥ã§ååãªå ŽåããããŸãããè¿ãã®å¹³é¢ã«ã¯ãã詳现ãªããªãŽã³ããŒã¹ã®ã¡ãã·ã¥ã䜿çšã§ããŸãã
- Web WorkersïŒãã¬ãŒã ãããããã¹ã¿ãã¿ãŒã®åå ãšãªãå¯èœæ§ã®ããã¡ã€ã³ã¹ã¬ããããããã¯ããªãããã«ãã¡ãã·ã¥çæãWeb Workerã«ãªãããŒãããŸãã
- ãžãªã¡ããªã®ç°¡ç¥åïŒãžãªã¡ããªã®ç°¡ç¥åã¢ã«ãŽãªãºã ã䜿çšããŠãã¡ãã·ã¥å ã®äžè§åœ¢ã®æ°ãæžãããŸããSimplify.jsã®ãããªã©ã€ãã©ãªã¯ããã®ç®çã«äœ¿çšã§ããŸãã
- å¹ççãªããŒã¿æ§é ïŒã¡ãã·ã¥ããŒã¿ã®æ ŒçŽããã³æäœã«å¹ççãªããŒã¿æ§é ã䜿çšããŸããTyped Arrayã¯ãéåžžã®JavaScripté åãšæ¯èŒããŠå€§å¹ ãªããã©ãŒãã³ã¹åäžãæäŸã§ããŸãã
å¹³é¢ã¡ãã·ã¥ãšã©ã€ãã£ã³ã°ããã³ã·ã£ããŠã®çµ±å
çã«æ²¡å ¥åã®ARäœéšãäœæããã«ã¯ãçæãããå¹³é¢ã¡ãã·ã¥ãšãªã¢ã«ãªã©ã€ãã£ã³ã°ããã³ã·ã£ããŠãçµ±åããããšãéèŠã§ããããã«ã¯ãã·ãŒã³ã«é©åãªã©ã€ãã£ã³ã°ãèšå®ããå¹³é¢ã¡ãã·ã¥ã§ã®ã·ã£ããŠãã£ã¹ãã£ã³ã°ãšåä¿¡ãæå¹ã«ããããšãå«ãŸããŸãã
å®è£ ïŒThree.jsã䜿çšïŒïŒ
// ã·ãŒã³ã«ãã£ã¬ã¯ã·ã§ãã«ã©ã€ãã远å ããŸã
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(0, 5, 5);
directionalLight.castShadow = true; // ã·ã£ããŠãã£ã¹ãã£ã³ã°ãæå¹ã«ããŸã
scene.add(directionalLight);
// ã·ã£ããŠãããèšå®ãæ§æããŸã
directionalLight.shadow.mapSize.width = 1024;
directionalLight.shadow.mapSize.height = 1024;
directionalLight.shadow.camera.near = 0.5;
directionalLight.shadow.camera.far = 15;
// ã¬ã³ãã©ãŒã«ã·ã£ããŠãæå¹ã«ããããã«èšå®ããŸã
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
// å¹³é¢ã¡ãã·ã¥ã«ã·ã£ããŠãåãåãããã«èšå®ããŸã
mesh.receiveShadow = true;
ã°ããŒãã«ãªèæ ®äºé ïŒ
ã©ã€ãã£ã³ã°æ¡ä»¶ã¯ãå°åãç°å¢ã«ãã£ãŠå€§ããç°ãªããŸããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®ARã¢ããªã±ãŒã·ã§ã³ãèšèšããå Žåãç°å¢ããããŸãã¯åçãªã©ã€ãã£ã³ã°æè¡ã䜿çšããŠãåšå²ã®ç°å¢ã®ã©ã€ãã£ã³ã°æ¡ä»¶ã«é©å¿ããããšãæ€èšããŠãã ãããããã«ãããäœéšã®ãªã¢ãªãºã ãšæ²¡å ¥æãåäžãããããšãã§ããŸãã
é«åºŠãªãã¯ããã¯ïŒã»ãã³ãã£ãã¯ã»ã°ã¡ã³ããŒã·ã§ã³ãšå¹³é¢åé¡
ææ°ã®ARãã©ãããã©ãŒã ã¯ãã»ãã³ãã£ãã¯ã»ã°ã¡ã³ããŒã·ã§ã³ãšå¹³é¢å顿©èœããŸããŸãçµã¿èŸŒãã§ããŸããã»ãã³ãã£ãã¯ã»ã°ã¡ã³ããŒã·ã§ã³ã¯ãã·ãŒã³å ã®ããŸããŸãªçš®é¡ã®ãªããžã§ã¯ãïŒäŸïŒåºãå£ã倩äºãå®¶å ·ïŒãç¹å®ããŠã©ãã«ä»ãããããšãå«ã¿ãŸããå¹³é¢åé¡ã¯ãæ€åºãããå¹³é¢ããã®åããšããããã£ïŒäŸïŒæ°Žå¹³ãµãŒãã§ã¹ãåçŽãµãŒãã§ã¹ïŒã«åºã¥ããŠåé¡ããããšã«ããããããããã«é²ããŸãã
å©ç¹ïŒ
- ãªããžã§ã¯ãé çœ®ã®æ¹åïŒã»ãã³ãã£ãã¯ã»ã°ã¡ã³ããŒã·ã§ã³ãšå¹³é¢åé¡ã¯ãä»®æ³ãªããžã§ã¯ããé©åãªãµãŒãã§ã¹ã«èªåçã«é 眮ããããã«äœ¿çšã§ããŸããããšãã°ãä»®æ³ããŒãã«ã¯ãåºãŸãã¯ããŒãã«ãšããŠåé¡ãããæ°Žå¹³ãµãŒãã§ã¹ã«ã®ã¿é 眮ã§ããŸãã
- ãªã¢ã«ãªã€ã³ã¿ã©ã¯ã·ã§ã³ïŒç°å¢ã®ã»ãã³ãã£ã¯ã¹ãçè§£ããããšã§ãä»®æ³ãªããžã§ã¯ããšçŸå®äžçãšã®éã§ãããªã¢ã«ãªã€ã³ã¿ã©ã¯ã·ã§ã³ãå¯èœã«ãªããŸããããšãã°ãä»®æ³ããŒã«ã¯æ€åºãããåºãµãŒãã§ã¹äžã§ãªã¢ã«ã«è»¢ããããšãã§ããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒãŠãŒã¶ãŒã®ç°å¢ãèªåçã«çè§£ããããšã«ãããARã¢ããªã±ãŒã·ã§ã³ã¯ããçŽæçã§ã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸãã
äŸïŒ
ãŠãŒã¶ãŒããªãã³ã°ã«ãŒã ãä»®æ³çã«å®¶å ·ã§é£Ÿãããšãã§ããARã¢ããªã±ãŒã·ã§ã³ãæ³åããŠãã ãããã»ãã³ãã£ãã¯ã»ã°ã¡ã³ããŒã·ã§ã³ãšå¹³é¢åé¡ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã¯åºãšå£ãèªåçã«èå¥ã§ãããŠãŒã¶ãŒã¯ä»®æ³å®¶å ·ã¢ã€ãã ãéšå±ã«ç°¡åã«é 眮ã§ããŸããã¢ããªã±ãŒã·ã§ã³ã¯ã倩äºã®ãããªäžé©åãªãµãŒãã§ã¹ã«å®¶å ·ãé 眮ããããšããŠãŒã¶ãŒã«é²ãããšãã§ããŸãã
ã¯ãã¹ãã©ãããã©ãŒã ã®èæ ®äºé
WebXRã¯ã¯ãã¹ãã©ãããã©ãŒã ã®AR/VRäœéšãæäŸããããšãç®çãšããŠããŸãããããã€ã¹ããã©ãããã©ãŒã éã§ã®å¹³é¢æ€åºæ©èœã«ã¯ãŸã ããã€ãã®éãããããŸããARKitïŒiOSïŒãšARCoreïŒAndroidïŒã¯ãWebXRãã¢ãã€ã«ããã€ã¹ã§å©çšããåºç€ãšãªãARãã©ãããã©ãŒã ã§ãããç²ŸåºŠãšæ©èœãµããŒãã®ã¬ãã«ãç°ãªãå ŽåããããŸãã
ãã¹ããã©ã¯ãã£ã¹ïŒ
- æ©èœæ€åºïŒæ©èœæ€åºã䜿çšããŠãçŸåšã®ããã€ã¹ã§ã®å¹³é¢æ€åºã®å¯çšæ§ã確èªããŸãã
- ãã©ãŒã«ããã¯ã¡ã«ããºã ïŒå¹³é¢æ€åºããµããŒãããªãããã€ã¹ã®ãã©ãŒã«ããã¯ã¡ã«ããºã ãå®è£ ããŸããããšãã°ããŠãŒã¶ãŒãã·ãŒã³ã«ä»®æ³ãªããžã§ã¯ããæåã§é 眮ã§ããããã«ããããšãã§ããŸãã
- é©å¿æŠç¥ïŒå¹³é¢æ€åºã®å質ã«åºã¥ããŠã¢ããªã±ãŒã·ã§ã³ã®åäœã調æŽããŸãã平颿€åºãä¿¡é Œã§ããªãå Žåã¯ãä»®æ³ãªããžã§ã¯ãã®æ°ãæžãããããã€ã³ã¿ã©ã¯ã·ã§ã³ãåçŽåããããããå ŽåããããŸãã
å«ççèæ ®äºé
ARãã¯ãããžãŒããŸããŸãæ®åããã«ã€ããŠã平颿€åºãšãµãŒãã§ã¹ãžãªã¡ããªäœæã®å«çç圱é¿ãèæ ®ããããšãéèŠã§ãã1ã€ã®æžå¿µã¯ããã©ã€ãã·ãŒäŸµå®³ã®å¯èœæ§ã§ããARã¢ããªã±ãŒã·ã§ã³ã¯ãèªå® ããªãã£ã¹ã®ã¬ã€ã¢ãŠããå«ãããŠãŒã¶ãŒã®ç°å¢ã«é¢ããããŒã¿ãåéã§ããŸãããã®ããŒã¿ãã©ã®ããã«äœ¿çšãããŠãããã«ã€ããŠéææ§ãä¿ã¡ããŠãŒã¶ãŒã«ãã©ã€ãã·ãŒèšå®ãå¶åŸ¡ã§ããããã«ããããšãäžå¯æ¬ ã§ãã
å«çã¬ã€ãã©ã€ã³ïŒ
- ããŒã¿æå°åïŒã¢ããªã±ãŒã·ã§ã³ã®æ©èœã«å¿ èŠãªããŒã¿ã®ã¿ãåéããŸãã
- éææ§ïŒããŒã¿ãã©ã®ããã«åéããã䜿çšãããŠãããã«ã€ããŠéææ§ããããŸãã
- ãŠãŒã¶ãŒå¶åŸ¡ïŒãŠãŒã¶ãŒã«ãã©ã€ãã·ãŒèšå®ãå¶åŸ¡ã§ããããã«ããŸãã
- ã»ãã¥ãªãã£ïŒãŠãŒã¶ãŒããŒã¿ãå®å šã«ä¿åããã³éä¿¡ããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒARã¢ããªã±ãŒã·ã§ã³ãé害ãæã€ãŠãŒã¶ãŒã«ãã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŸãã
çµè«
WebXRå¹³é¢ã¡ãã·ã¥çæã¯ãæ²¡å ¥åARäœéšãäœæããããã®åŒ·åãªãã¯ããã¯ã§ããçŸå®äžçã®ãµãŒãã§ã¹ãæ£ç¢ºã«æ€åºã衚çŸããããšã«ãããéçºè ã¯ä»®æ³ãªããžã§ã¯ãããŠãŒã¶ãŒã®ç°å¢ã«ã·ãŒã ã¬ã¹ã«çµ±åã§ããŸããWebXRãã¯ãããžãŒãé²åãç¶ããã«ã€ããŠã平颿€åºãšã¡ãã·ã¥çæã®ããã®ããã«æŽç·Žããããã¯ããã¯ãç»å Žããããã«ãªã¢ã«ã§é åçãªARã¢ããªã±ãŒã·ã§ã³ãå¯èœã«ãªãããšãæåŸ ã§ããŸããeã³ããŒã¹äœéšïŒIKEAã®ARã¢ããªã§äžçäžã§èŠãããããã«ïŒã§ãŠãŒã¶ãŒãèªå® ã«å®¶å ·ãä»®æ³çã«é 眮ã§ããããã«ããããšãããçŸå®äžçã®ãªããžã§ã¯ãã«ã€ã³ã¿ã©ã¯ãã£ããªåŠç¿ææãéãåãããæè²ããŒã«ãŸã§ãå¯èœæ§ã¯åºå€§ã§ãã
ã³ã¢ã³ã³ã»ãããçè§£ããå®è£ ãã¯ããã¯ãç¿åŸãããã¹ããã©ã¯ãã£ã¹ãéµå®ããããšã«ãããéçºè ã¯ãŠã§ãã§å¯èœãªããšã®å¢çãæŒãåºãããçã«é åçãªARäœéšãäœæã§ããŸããããã©ãŒãã³ã¹ãåªå ããã¯ãã¹ãã©ãããã©ãŒã ã®äºææ§ãèæ ®ããå«ççãªèæ ®äºé ã«å¯ŸåŠããŠãARã¢ããªã±ãŒã·ã§ã³ãé åçã§è²¬ä»»ãããã®ã«ãªãããã«ããããšãå¿ããªãã§ãã ããã
ãªãœãŒã¹ãšãããªãåŠç¿
- WebXR Device API仿§ïŒ https://www.w3.org/TR/webxr/
- Three.jsïŒ https://threejs.org/
- Babylon.jsïŒ https://www.babylonjs.com/
- EarcutïŒäžè§æž¬éã©ã€ãã©ãªïŒïŒ https://github.com/mapbox/earcut
- ARKitïŒAppleïŒïŒ https://developer.apple.com/augmented-reality/arkit/
- ARCoreïŒGoogleïŒïŒ https://developers.google.com/ar
ãããã®ãªãœãŒã¹ãæ¢çŽ¢ããç¬èªã®WebXRãããžã§ã¯ãã§å¹³é¢ã¡ãã·ã¥çæã詊ãããšããå§ãããŸãããŠã§ãã®æªæ¥ã¯æ²¡å ¥åã§ãããWebXRã¯ãã®æªæ¥ãæ§ç¯ããããã®ããŒã«ãæäŸããŸãã