æ¬æä»¥æ¸è¿å¼Webåºç¨ç¨åºä¸ºåºç¡ï¼åæ¨è®¨è®ºå¦ä½ä½¿ç¨A-FrameåWebXRï¼æ¥æå»ºèæç°å®ï¼VRï¼åå¢å¼ºç°å®ï¼AR)ã
èæç°å®(Virtual Realityï¼VR)å°äººä»¬å¸¦å°äºå¦ä¸ä¸ªä¸çï¼è®©å¤§å®¶ä½éªå°èªå·±å°±å¥½å置身äºèæä¸çä¸çæè§ãèå¢å¼ºç°å®(Augmented Realityï¼AR)æä¾äºå°ç°å®ä¸çåèæä¸çèåå¨ä¸èµ·çå¯è½æ§ãä¾å¦ï¼ç´æã社交ã以åèºæ¯çåºæ¯ï¼å¯ä»¥è¯´ï¼VRåARé½ä¸ºäººç±»è¡ä¸ºçæ¹åãç¥è¯ç转移ãå¹è®ã以åç ç©¶ï¼æä¾äºç¬ç¹çæºä¼ä¸æ¹å¼ãä¸è¿ï¼ææè¿äºåºç¨å¦ä»é½å¯ä»¥å¨æµè§å¨ä¸å®ç°äºãä¸é¢ï¼æå°ä»¥æ¸è¿å¼Webåºç¨ä¸ºåºç¡ï¼ä½¿ç¨A-FrameåWebXRçWeb API䏿¨æ·±å ¥æ¢ç©¶ã
ä»ä¹æ¯A-Frame?

A-Frameæ¯ä¸ä¸ªåºäºHTMLçãå¯ç¨äºæå»ºVRåARä½éªçWebæ¡æ¶ã仿¬è´¨ä¸è¯´ï¼å®æ¯ä¸ä¸ªå¼ºå¤§çå®ä½æ¡æ¶ï¼æä¾äºå¯æ©å±åå¯éç¨çç»æãç±äºA-Frame建ç«å¨WebXRåThree.jsä¹ä¸ï¼å æ¤å¼åè å¯ä»¥ä¸åéå¶å°è®¿é®JavaScriptãDOM APIãthree.jsãWebXRåWebGLãå ¶ä¸ï¼WebXRæ¯ä¸ç§å¯ç¨äºå¨æµè§å¨ä¸å建VRåARä½éªçWeb APIï¼Three.jsæ¯ä¸ç§VR/ARæ¡æ¶ï¼èWebGLåè´è´£æ¸²æã
å¦ä½ä¸æ?
æ¨å¯ä»¥å¨æ éé¢å¤å®è£ çæ åµä¸ï¼éè¿HTMLæä»¶æ¥å¼åA-Frameåºç¨ãâA-Frame妿 ¡âæä¾äºä¸°å¯çA-Frameå¦ä¹ èµæºãæ¨å¯ä»¥éè¿Glitchä¸çâå ¥é¨ç¤ºä¾âï¼æ¥äºè§£åè¯ç¨A-Frameãæ¤å¤çGlitchæ¯ä¸ä¸ªéç¨äºJavaScriptåNode.jsçå¨çº¿å¼IDEã
A-Frameä¸çECS
åºäºECSæ¶æçA-Frame常被ç¨äºå¼å3D游æãæ¤å¤çECS(å®ä½-ç»ä»¶-ç³»ç»ï¼Entity-component-system)æ¶ææ¯ä¸ç§éµå¾ªâç»åä¼äºç»§æ¿(composition over inheritance)âååçæ¨¡å¼ãä¹å°±æ¯è¯´ï¼æ¯ä¸ªå®ä½é½æ¯ç±ç»ä»¶æç»æï¼å¹¶å¯ä»¥é¾æ¥å°å®¹å¨ç对象ä¸ãä½ä¸ºå¯éç¨ç模åï¼ç»ä»¶å¯ä»¥é¾æ¥å°å®ä½ä¸ï¼ä»¥åå®ä½æä¾ç¸åºçåè½ã
ææé»è¾é½æ¯éè¿ç»ä»¶å®ç°çãæä»¬å¯ä»¥éè¿é ç½®åæ··åç»ä»¶ï¼æ¥å®ä¹ä¸åç±»åçå®ä½ãå ¶ä¸ï¼A-Frameéè¿æä¾å¦ä¸APIï¼æ¥ä»£è¡¨ECSçå个é¨åï¼
ç¨å ç´ æ¥è¡¨ç¤ºå®ä½
ç¨ä¸çHTML屿§æ¥è¡¨ç¤ºç»ä»¶
å®ä½çæ½è±¡ä¾åï¼
ä¸é¢è®©æä»¬æ¥æ¥çä¸äºä½¿ç¨åç§ç»ä»¶ï¼æ¥æå»ºå®ä½çæ½è±¡ç¤ºä¾ãå ¶ä¸Sphere(çä½)æ¯ä¸ä¸ªå®ä½ï¼èPositionãGeometryåMaterialæ¯è¯¥å®ä½çç»æé¨åã
Sphere = Position + Geometry + MaterialBall = Position + Velocity + Physics + Geometry + Material1.2.
A-Frameä¸çè¯æ³å®ä½
å¦ä¸ä»£ç 段æç¤ºï¼æä»¬æ ¹æ®åé¢ç示ä¾ï¼å建äºSphereå®ä½çè¯æ³ï¼
HTML
1.2.3.
ä»£ç æ¸ å 1
å¯è§ï¼è¦ç»å¶è¯¥çä½ï¼æ¨éè¦å®ä¹ä¸ä¸ªï¼å¹¶å°ç»ä»¶æ·»å 为HTML屿§ãé常ï¼å¤§å¤æ°ç»ä»¶é½ä¼æå¤ä¸ªå±æ§ï¼å¹¶ä½¿ç¨ç±»ä¼¼äºCSSçè¯æ³æ¥è¡¨ç¤ºã
å ä½ä½(Primitives)
A-Frameæä¾äºè¯¸å¦æçå ä½ä½å ç´ ãå®ä»¬æ¯ä¸äºæ¹ä¾¿åå¦è å¨A-Frameä¸ä½¿ç¨çHTMLå ç´ ï¼å¯è¢«ç¨äºå è£ åºå±çå®ä½ç»ä»¶ãå¦ä¸ä»£ç 段å±ç¤ºäºå ä½ä½ 被å å«å¨å¸¦æåç§å ä½ä½åç©æç»ä»¶çä¹ä¸ã
HTML
Primitive:Entity: 1.2.3.4.
ä»£ç æ¸ å 2
å¨DeBrowserä¸æå»ºVRåºæ¯
ä¸é¢ï¼è®©æä»¬æ¥æå»ºä¸ä¸ªå å«äºåç§å®ä½åå¨ç»çåºæ¬A-Frame VRåºæ¯(å¦ä¸å¾æç¤º)ã

å¾ 1
é¦å ï¼æä»¬éè¦ä¸ºæ¤é¡¹ç®å建ä¸ä¸ªæä»¶å¤¹ãæ¥çï¼å¨è¯¥âé¡¹ç®æä»¶å¤¹âä¸å建ä¸ä¸ªindex.htmlææ¡£ï¼å¹¶å°å¦ä¸HTMLä»£ç æ¾å ¥å ¶ä¸ï¼
HTML
1.2.3.4.5.6.7.8.9.
ä»£ç æ¸ å 3
æä»¬éè¦å°ææ°çæ¬çA-Frameä½ä¸ºèæ¬æ ç¾ï¼å å«å¨ä¸ï¼å¹¶ä¸å¨ä¸å 嫿 ç¾ã
ä»ä¹æ¯åºæ¯?
ææå®ä½åç»ä»¶é½å¿ 须被添å å°å¾ 渲æçåºæ¯ä¸ãå¨A-Frameä¸ï¼åºæ¯æ¯ç±å®ä½è¡¨ç¤ºçãè½å¤ä¸ºæä»¬å¤çä¸ä¸ª.jsåWebXRæ ·æ¿ï¼å ¶ä¸å æ¬è®¾ç½®WebGL(è´è´£æ¸²æ)ãç»å¸ãç¸æºãç¯å ãæ¸²æå¨ã渲æå¾ªç¯ã以åé对HTC ViveãOculus RiftãSamsung GearVRçå¹³å°å¼ç®±å³ç¨(out-of-the-box)çWebXRæ¯æã
éè¿Entityç±»ï¼åºæ¯å®ä½ç»§æ¿äºå ¶ææå±æ§ã龿¥ç»ä»¶çè½åã以åå¨å¼å§æ¸²æå¾ªç¯ä¹åï¼çå¾ å ¶ææåå®ä½åèç¹(ä¾å¦å)çå è½½è¡ä¸ºã
æ·»å å®ä½
卿们çä¸ï¼æ¨å¯ä»¥ä½¿ç¨A-Frameçä¸ç§é»è®¤å ä½ä½(å¦)æ¥æ·»å åç§3Då®ä½ãå¦ä¸ä»£ç 段å®ä¹äºçé¢è²ã
HTML
1.2.3.
ä»£ç æ¸ å 4

å¾ 2
å¦ä¸å¾å¯è§ï¼ç±äºç¸æºåé½é»è®¤ä½äº0ã0ã0åç¹ä¸ï¼é£ä¹å¨æªå¯¹å ¶ç§»å¨ä¹åï¼æ¨å°æ æ³çå°è¯¥çåãå æ¤ï¼æ¨å¯ä»¥éè¿ä½¿ç¨âä½ç½®ç»ä»¶(position component)âå°box转æ¢ä¸º3Då½¢å¼ç空é´å±ç¤ºã
å¨3Dä¸è½¬æ¢å®ä½
让æä»¬å æ¥çç3D空é´ãå¦ä¸å¾æç¤ºï¼A-Frame使ç¨çæ¯å³æåæ ç³»ï¼å³é»è®¤çç¸æºæ¹å为ï¼Xè½´æ£æ¹ååå³å»¶ä¼¸ï¼Yè½´æ£æ¹ååä¸å»¶ä¼¸ï¼Zè½´æ£æ¹ååçæä»¬ä¼¸åºå±å¹ï¼

å¾ 3
ä½¿å¯¹ç¸æºå¯è§
æä»¬éè¦è®©çå对äºç¸æºå¯è§ãå¯æè½¬å¹¶å¯ç¼©æ¾ãé¦å ï¼ä¸ºäºä½¿å ¶å¯è§ï¼æ¨å¯ä»¥ä½¿ç¨ä½ç½®ç»ä»¶å¨è´Zè½´ä¸å°çåååæ»å¨5ç±³ãåæ¶ï¼æ¨è¿åºè¯¥å¨æ£Yè½´ä¸ï¼å°çååä¸ç§»å¨2ç±³ï¼è¿æ ·çåå°±ä¸ä¼ä¸åºé¢ç¸äº¤ã
为äºä½¿å ¶å¯æè½¬ä¸ç¼©æ¾ï¼æä»¬åæ ·éè¦ä½¿ç¨ç¸åçå³æåæ ç³»ï¼å°çåå¾æå¹¶è®©å ¶å°ºå¯¸ç¿»å(å¦ä¸ä»£ç 段æç¤º)ã
HTML
1.2.3.4.
ä»£ç æ¸ å 5
ç±äºWebXRçAPIæ¯ä»¥ç±³ä¸ºå使¥è¿åä½ç½®çï¼å æ¤A-Frameçè·ç¦»åä½ä¹æ¯âç±³âãå¨ä¸ºVRè®¾è®¡åºæ¯æ¶ï¼æä»¬éè¦èèå®ä½ççå®ä¸ç缩æ¾ãä¸ä¸ªheight="10" ççåï¼å¨ä½ çæ¡é¢ä¸ä¹è®¸çèµ·æ¥å¾æ£å¸¸ï¼ä½æ¯å¨VRä¸å°±æ¾å¾è¿å¤§äºãæ¤å¤ï¼æè½¬çåä½ä¸ºâ度âï¼ä¸è¿å®å¨è½¬æ¢å°three.jsæ¶ï¼åä¼å¨å é¨è¢«è½¬æ¢ä¸ºå¼§åº¦ã
ç¶å转æ¢
A-FrameçHTMLä¹å¯ä»¥è¡¨ç¤º3Dåºæ¯å¾ãå¨åºæ¯å¾ä¸ï¼å®ä½å¯ä»¥æä¸ä¸ªç¶çº§åå¤ä¸ªå级ãåå®ä½è½å¤ä»å ¶ç¶å®ä½å¤ç»§æ¿åç§åæ¢(å æ¬ï¼ä½ç½®ãæè½¬å缩æ¾)ãä¾å¦ï¼æä»¬å¯ä»¥å°æä¸ªâçä½âä½ä¸ºæä¸ªçåçåå ç´ (å¦ä¸å¾æç¤º)ï¼
HTML
1.2.3.4.5.
ä»£ç æ¸ å 6
ç±è®¡ç®å¯ç¥ï¼çä½çä½ç½®ä¸º1ã2ã3ãè¿æ¯éè¿å°çä½çç¶ä½ç½®ä¸å ¶èªèº«ä½ç½®ç»è£ å¨ä¸èµ·èå®ç°çãåæ ·ï¼çä½å°ä¼ç»§æ¿çåçæè½¬å缩æ¾ã
æ·»å ç¯å¢ç»ä»¶
A-Frameå 许å¼å人åå建åç§å¯ä»¥è®©å ¶ä»äººè½»æ¾ä½¿ç¨çå¯éç¨ç»ä»¶ãä¾å¦ï¼ç¯å¢ç»ä»¶å°±è½å¤éè¿ä¸è¡HTML代ç ï¼ä¸ºæä»¬çæäºåç§ç¯å¢ãå®ä¸ä½æ¹ä¾¿æä»¬ä¾¿æ·å°å¯å¨VRåºç¨ï¼è䏿ä¾äºåå¤ç§å ·æä¼å¤åæ°çç¯å¢ã
为æ¤ï¼æä»¬é¦å éè¦æ·»å 带æèæ¬æ ç¾çç¯å¢ç»ä»¶ãéè¿unpkg.comï¼æ¨å¯ä»¥è·å¾æåç¸å ³npm模åçææ°CDN龿¥(å¦ä¸ä»£ç 段æç¤º)ã
HTML
1.2.3.4.5.
ä»£ç æ¸ å 7
ç¶åï¼å¦ä¸ä»£ç 段æç¤ºï¼è¯·å¨ç±ç¯å¢ç»ä»¶é¾æ¥å°çæ è®°ä¸ï¼æ·»å ä¸ä¸ªa-entityãæ¨å¯ä»¥æå®è¯¸å¦preset:forestçé¢è®¾ç¯å¢ï¼ä»¥åâæ æ¨æ°éâå°âä¿®æ´éâç许å¤å ¶ä»åæ°ã
HTML
1.2.3.4.5.6.
ä»£ç æ¸ å 8
é¢è®¾æ¯å®ä¹ç¹å®æ ·å¼çåæ°å¼ç»åï¼å®ä»¬æ¯æ¨å®ç°èªå®ä¹çèµ·ç¹ãæ¨å¯ä»¥æä¸ctrl+alt+iï¼è°ç¨æ£æ¥å¨(Inspector)æ¥è°æ´è¿äºåæ°ãå¦ä¸å¾æç¤ºï¼ä½ä¸ºä¸ç§ç¨äºæ£æ¥åè°æ´å®ä½/ç»ä»¶çå·¥å ·ï¼æ£æ¥å¨ç±»ä¼¼äºæµè§å¨çDOMæ£æ¥å¨ï¼ä¸è¿å®æ¯ä¸ä¸º3DåA-Frameé身å®å¶çã

å¾ 4
æ·»å èµäº§ç®¡çç³»ç»
æ¨å¯ä»¥ä½¿ç¨å ç´ å°çº¹ç(texture)åºç¨å°boxä¸ãå ¶ä¸ï¼èµäº§ç®¡ç(Asset Management)å¯ä»¥å¨æ¸²æåºæ¯ä¹åï¼å è½½åç¼åå¾ååè§é¢ãé¢å è½½åç¼åçæ¹å¼å¯æé«æ§è½ãå¦ä¸ä»£ç 段便æ¯å¦ä½å°èµäº§ç®¡çåºç¨å°å¾åä¸ç示ä¾ï¼
HTML
1.2.3.4.5.6.7.8.9. ![]()
ä»£ç æ¸ å 9
ä¸é¢å®ä¹äºä¸ä¸ªå¸¦æå¾å纹ççæ ç¾ãå¦ä¸å¾æç¤ºï¼è¯¥imgæä¸ä¸ªid="boxTexture"ã该idä¼ä»¥src="#boxTexture"æ¹å¼è¢«å¼ç¨å°çåä¸ã

å¾ 5
æ·»å å¨ç»
å¦ä»£ç æ¸ å10æç¤ºï¼æ¨å¯ä»¥ä½¿ç¨å¨ç»ç»ä»¶ä¸ºçååçä½è®¾ç½®å¨ç»ï¼ä¾å¦ï¼éè¿è®¾ç½®å¦ä¸å 容ï¼è®©çåå¯ä»¥ä¸ä¸ç§»å¨ï¼
è®¾ç½®å±æ§ï¼object3D.position.y; to: 2.2ï¼å®ç°çåå¨Yè½´ä¸ç2å°2.2ç±³ä¹é´ç§»å¨ã
卿¹å(dir)ä¸å¯ä»¥äº¤æ¿ä¸ååä¸éã
å°2000毫ç§è®¾ç½®ä¸ºæç»ä¸ä¸ªå¨æçæ¶é¿ã
ç¨loopæå®å¨ç»çæ ééå¤ã
HTML
1.2.3.4.5.6.7.8.9.10. ![]()
ä»£ç æ¸ å 10
ä¸è¿°ä»£ç çæç»è¿è¡ç»æï¼å¦ä¸å¾æç¤ºï¼æ¨ä¹å¯ä»¥å¨Glitch䏿¥çå°ã

å¾ 6
å¢å¼ºç°å®
å½ç¶ï¼A-Frameä¹å¯ä»¥å®ç°ARçä½éªãåæ ·ï¼æ¨å¯ä»¥åèGlitchä¸ç»åºäºå ¥é¨ç¤ºä¾ï¼ä½ä¸ºå®ç°ARçèµ·ç¹ã

å¾ 7
æ¤ç¤ºä¾å·²é对ARçâå½ä¸æµè¯(hit testing)âåºç¨è¿è¡äºæ©å±ãå ¶ç»æå¯ä»¥å¨å¦ä¸ä»£ç æ®µä¸æ¥çå°ãå ¶ä¸çç²ä½é¨å为添å çå 容ãå½ç¶ï¼æ¨ä¹å¯ä»¥éè¿é¾æ¥--https://glitch.com/edit/#!/ar-basic-hittestï¼åèglitchä¸çå ·ä½å®ç°è¿ç¨ãæ¤å¤ï¼æ¨è¿å¯ä»¥éè¿URL--https://ar-basic-hittest.glitch.me/ï¼å¨èªå·±çææºä¸æµè¯å ¶æç»çæ¬ã
HTML
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.
ä»£ç æ¸ å 11
ä»ä¹æ¯ARå½ä¸æµè¯?
å½ä¸æµè¯å¯ä»¥å°èæå¯¹è±¡ä¸ç°å®ä¸çä¸ç对象(å¦å°æ¿ãæ¡ååå¢å£ç)ç¸å¯¹é½ãå¨ä¸é¢ç示ä¾ä¸ï¼æ¨å¯ä»¥å°ä¸å¾ 7 ä¸ç对象å 嵿¾ç½®å°æ¡ä¸ãå ¶æ¹æ³æ¯éè¿ç¸æºï¼ä½¿ç¨åå线çåæ¡åï¼ç¶åå®ä½è¯¥æ¡å(å³å½ä¸æµè¯)ã
å¨ARä¸è¿è¡å½ä¸æµè¯åï¼æ¨éè¦é¦å å¨èæ¬æ ç¾ä¸å å«ar-components.jsãæ¨å¯ä»¥ç´æ¥ä»Glitchå¤å¤å¶æ¤åº--https://glitch.com/edit/#!/ar-basic-hittestã
å¨åºæ¯æ ç¾ä¸ï¼æ¨åºå½éè¿hit testå½ä»¤ï¼ææè¦ç¨å°çWebXRåè½ãç¶åéè¿a-entityå»åºç¨å¯¹è±¡çç宿¯ä¾ã
æåï¼è¯·ä½¿ç¨ç»ä»¶å®ä¹ä¸ä¸ªæ°å®ä½ï¼ar-hit-testã该ç»ä»¶å¯ä»¥å°èæå¯¹è±¡å èå¹¶æ¾ç½®å¨æ¨éè¿ç¸æºçå°ççå®å¯¹è±¡ä¸ï¼å¦ä¸å¾æç¤ºãä¸ºäºæ¯æå½ä¸æµè¯ï¼è¯·éè¿a-planeç»ä»¶å»å®ä¹ä¸ä¸ª20åç±³çæ£æ¹å½¢æ 线ã

å¾ 8
屿
A-Frameè¿å¯ä»¥å®ç°æ´å¤çVRåARåºç¨ãæ¨å¯ä»¥éè¿é¾æ¥--https://aframe.io/ï¼æ¥é å°æ´å¤ç示ä¾åææ¡£ãä¾å¦ï¼æ¨å¯ä»¥ä½¿ç¨å½ä¸æµè¯å»å¶ä½âARç¯®çæ¸¸æâçã
è¯è ä»ç»
é å³» ï¼Julian Chenï¼ï¼51CTO社åºç¼è¾ï¼å ·æåå¤å¹´çIT项ç®å®æ½ç»éªï¼åäºå¯¹å å¤é¨èµæºä¸é£é©å®æ½ç®¡æ§ï¼ä¸æ³¨ä¼ æç½ç»ä¸ä¿¡æ¯å®å ¨ç¥è¯ä¸ç»éªï¼æç»ä»¥åæãä¸é¢åè¯æçå½¢å¼ï¼åäº«åæ²¿ææ¯ä¸æ°ç¥ï¼ç»å¸¸ä»¥çº¿ä¸ã线ä¸çæ¹å¼ï¼å¼å±ä¿¡æ¯å®å ¨ç±»å¹è®ä¸æè¯¾ã
åææ é¢ï¼Virtual Reality and Augmented Reality in the Browserï¼ä½è ï¼Peter Eijgermans

