150行JavaScript程式碼實現擴增實境
擴增實境技術(Augmented Reality,簡稱 AR),是一種實時地計算攝影機影像的位置及角度並加上相應影像、視訊、 3D 模型的技術,這種技術的目標是在螢幕上把 虛擬 世界套在現實世界並進行互動。這種技術1990年提出。隨著隨身電子產品 CPU 運算能力的提升,預期擴增實境的用途將會越來越廣。
本文介紹使用JavaScript開源框架AR.js實現的擴增實境的Hello World例子。
先看效果:
首先在手機瀏覽器裡開啟我部署在github page上的這個demo應用:
https://i042416.github.io/FioriODataTestTool2014/WebContent/098_ar.html
我用的是Android手機安裝的Chrome瀏覽器。
開啟網頁,會提示你是否允許這個網頁應用訪問您的手機攝像頭。點選允許:
用手機上的攝像頭掃描這張圖片:
神奇的事情就發生了。您會看到,通過手機攝像頭望過去,手機螢幕裡會出現一個新的不斷滾動的3D物體,如下圖所示。
下面具體介紹這個最簡單的例子是怎麼開發出來的。
所有的原始碼在我的github上:
https://github.com/i042416/FioriODataTestTool2014/tree/master/WebContent/ar
新建一個html檔案,把下列150行程式碼貼上進去,然後在伺服器上執行,使用之前描述的步驟即可進行AR測試:
<!DOCTYPE html><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><script src='ar/lib/three.min.js'></script><script src="ar/lib/stats.min.js"></script><script src="ar/lib/ar.js"></script><script>debugger; THREEx.ArToolkitContext.baseURL = '';</script><body style='margin : 0px; overflow: hidden; font-family: Monospace;'><div style='position: absolute; top: 10px; width:100%; text-align: center; z-index: 1;'><script> var renderer = new THREE.WebGLRenderer({ // antialias : true, alpha: true }); renderer.setClearColor(new THREE.Color('lightgrey'), 0) // renderer.setPixelRatio( 1/2 ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.domElement.style.position = 'absolute' renderer.domElement.style.top = '0px' renderer.domElement.style.left = '0px' document.body.appendChild( renderer.domElement ); // array of functions for the rendering loop var onRenderFcts= []; // init scene and camera var scene = new THREE.Scene(); var camera = new THREE.Camera(); scene.add(camera); var arToolkitSource = new THREEx.ArToolkitSource({ // to read from the webcam sourceType : 'webcam', // to read from an image // sourceType : 'image', // sourceUrl : THREEx.ArToolkitContext.baseURL + '../data/images/img.jpg', // to read from a video // sourceType : 'video', // sourceUrl : THREEx.ArToolkitContext.baseURL + '../data/videos/headtracking.mp4', }) arToolkitSource.init(function onReady(){ onResize() }) window.addEventListener('resize', function(){ onResize() }) function onResize(){ arToolkitSource.onResize() arToolkitSource.copySizeTo(renderer.domElement) if( arToolkitContext.arController !== null ){ arToolkitSource.copySizeTo(arToolkitContext.arController.canvas) } } var arToolkitContext = new THREEx.ArToolkitContext({ // cameraParametersUrl: THREEx.ArToolkitContext.baseURL + '../data/data/camera_para.dat', cameraParametersUrl: 'ar/data/data/camera_para.dat', detectionMode: 'mono', maxDetectionRate: 30, canvasWidth: 80*3, canvasHeight: 60*3, }) arToolkitContext.init(function onCompleted(){ camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() ); }) onRenderFcts.push(function(){ if( arToolkitSource.ready === false ) return; arToolkitContext.update( arToolkitSource.domElement ) }) var markerRoot = new THREE.Group scene.add(markerRoot) var artoolkitMarker = new THREEx.ArMarkerControls(arToolkitContext, markerRoot, { type : 'pattern', patternUrl : THREEx.ArToolkitContext.baseURL + 'ar/data/data/patt.hiro' }) // build a smoothedControls var smoothedRoot = new THREE.Group() scene.add(smoothedRoot) var smoothedControls = new THREEx.ArSmoothedControls(smoothedRoot, { lerpPosition: 0.4, lerpQuaternion: 0.3, lerpScale: 1, }) onRenderFcts.push(function(delta){ smoothedControls.update(markerRoot) }) var arWorldRoot = smoothedRoot // add a torus knot var geometry = new THREE.CubeGeometry(1,1,1); var material = new THREE.MeshNormalMaterial({ transparent : true, opacity: 0.5, side: THREE.DoubleSide }); var mesh = new THREE.Mesh( geometry, material ); mesh.position.y = geometry.parameters.height/2 arWorldRoot.add( mesh ); var geometry = new THREE.TorusKnotGeometry(0.3,0.1,64,16); var material = new THREE.MeshNormalMaterial(); var mesh = new THREE.Mesh( geometry, material ); mesh.position.y = 0.5 arWorldRoot.add( mesh ); onRenderFcts.push(function(){ mesh.rotation.x += 0.1 }) var stats = new Stats(); document.body.appendChild( stats.dom ); // render the scene onRenderFcts.push(function(){ renderer.render( scene, camera ); stats.update(); }) // run the rendering loop var lastTimeMsec= null requestAnimationFrame(function animate(nowMsec){ // keep looping requestAnimationFrame( animate ); // measure time lastTimeMsec = lastTimeMsec || nowMsec-1000/60 var deltaMsec = Math.min(200, nowMsec - lastTimeMsec) lastTimeMsec = nowMsec // call each update function onRenderFcts.forEach(function(onRenderFct){ onRenderFct(deltaMsec/1000, nowMsec/1000) }) })</script></body>
當然,這個效果來自大神jeromeetienne開源的AR.js:
https://github.com/jeromeetienne/AR.js/
當然大神自己也很謙虛地提到,他這個開源的擴增實境框架也是建立在巨人的肩膀上開發的:比如其中3D效果的繪製,使用到了另一個開源框架three.js:
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2472204/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SuperData:擴增實境成為主流
- 如何使用JavaScript開發AR(擴增實境)移動應用 (一)JavaScript
- MobiDev:2022年擴增實境開發指南IDEdev
- JavaScript實現佇列(程式碼+測試)JavaScript佇列
- AR擴增實境的發展趨勢分析
- AR擴增實境可應用的場景
- 使用 JavaScript 開發AR(擴增實境)移動應用的預備知識和環境搭建JavaScript
- JavaScript中的繼承及實現程式碼JavaScript繼承
- DigitalBridge:擴增實境正在改變零售業Git
- AR擴增實境應用領域大盤點
- 180行JavaScript程式碼實現的小球隨機移動程式碼JavaScript隨機
- 《整潔程式碼cleancode》的javascript原始碼實現專案JavaScript原始碼
- ARKit:擴增實境技術在美團到餐業務的實踐
- JavaScript模擬拋物運動的程式碼實現JavaScript
- 30行Javascript程式碼實現圖片懶載入JavaScript
- Tomcat程式碼實現Tomcat
- Promise 程式碼實現Promise
- JavaScript實現專案列表的增刪移動JavaScript
- 銀彈谷:中國擴增實境(AR)行業研究報告行業
- 擴增實境技術是什麼?能用在哪些地方?
- ABI Research:截止2020年擴增實境(AR)和虛擬現實(VR)市場總投資超20億美元VR
- OutputStreamWriter介紹&程式碼實現和InputStreamReader介紹&程式碼實現
- Locust 程式碼指令碼實現指令碼
- 低程式碼如何幫助企業實現業務增長?
- HMS Core攜手廈門大學打造AR擴增實境技術
- AR擴增實境在數字化展廳中的應用形式
- AR擴增實境技術在展廳中所存在的價值
- 如何實現程式碼高亮
- HashTable實現程式碼分享
- 微信小程式(JAVAScript)實現餅圖微信小程式JavaScript
- Laravel核心程式碼學習 -- Model增刪改查底層實現Laravel
- Laravel核心程式碼學習 — Model增刪改查底層實現Laravel
- Linklist程式碼實現以及程式碼解讀
- JavaScript Ajax 實現JavaScript
- 利用JavaScript實現註冊頁面省市聯動效果(附程式碼)JavaScript
- AR擴增實境技術在多媒體展廳中的應用
- AR擴增實境在數字企業展廳中是如何使用的?
- AES和DES程式碼實現