21.WebAR那些事:ARDemo之《天馬行空》
緊接上文
使用WebAR技術,開發者只需40行程式碼,即可搭建一個ARDemo。同時我們也丟擲了一個問題,如果把地球模型,換成一個可以動的小貓小狗,是不是就更加接近虛擬現實了?
本次Demo所需二維碼
本次demo已經整合到APK中,使用者可以點選《天馬星空》來體驗。
天馬星空
環境準備
- Demo使用r82版本,向下相容
- Three.js 到http://www.threejs.org下載最新原始碼,這裡使用three.min.js作為渲染引擎。
- WebVR.js WebVR的工具庫,用於切換VR狀態(three.js的原始碼包中,自己拷貝)
- VREffect.js WebVR的展示庫,用於分屏展示(three.js的原始碼包中,自己拷貝)
- VRControls.js WebVR的控制庫,用於監控陀螺儀、Camera、重力等(three.js的原始碼包中,自己拷貝)
3D模型
之前我們總是使用地球的3D模型,估計各位看官也看膩了,這次終於更新了!
- 支援動畫的3D模型
通過閱讀THREE.JS的示例,找到了喜歡的模型,一批奔跑的馬兒。
在webgl分類下的shadowmap入口,可以看到官方的demo。
- 3D模型的格式
本次演示的3D模型,是JSON格式,可以有多種工具生成,比如3DMax、瑪雅等。
這種格式雖然方便閱讀,缺點也比較明顯,將整個檔案解析成json後,再轉換成記憶體資料,最後上傳到GPU,由於JS語言在運算處理方面的不足,載入過程會稍慢一些。
- WebVRSDK支援的3D格式
開啟THREE.JS的官方example,可以看到loder分類的3D模型格式,初步可以理解為,只要three.js支援的格式,WebVRSDK也是可以支援的。如果有不支援,請反饋給我,我會及時更新WebVRSDK
相容性準備
獲取攝像頭API,目前只支援Navigator.getUserMedia
index.js核心程式碼
核心程式碼量約50行,核心程式碼和《上一篇》基本一致,只是將3D地球的模型,替換成了一批馬。
程式碼參考Three.js,如下
var w = window.innerWidth;
var h = window.innerHeight;
var renderer = new THREE.WebGLRenderer(); // 建立渲染器
renderer.setSize(w, h); // 設定渲染器為全屏
document.body.appendChild(renderer.domElement); // 將渲染器新增到body上
var horse, delta;
var clock = new THREE.Clock(); // 建立時鐘
var scene = new THREE.Scene(); // 建立場景
var mixer = new THREE.AnimationMixer(scene); // 建立混合器
var camera = new THREE.PerspectiveCamera(45, w / h, 100, 3000);
var control = new THREE.VRControls(camera); // 控制器,用來控制攝像機
var effect = new THREE.VREffect(renderer); // 控制器,用來控制VR渲染
var loader = new THREE.JSONLoader(); // 載入器,用於載入3D模型
loader.load("horse.json", function(geometry) {
var material = new THREE.MeshLambertMaterial({ color: 0xFFAA55, morphTargets: true, vertexColors: THREE.FaceColors });
horse = new THREE.Mesh(geometry, material);
horse.speed = 200;
horse.position.x = -500;
scene.add(horse);
scene.add(new THREE.AmbientLight(0x444444));// 建立環境光
scene.add(new THREE.DirectionalLight(0xFFFFFF, 1, 0));
mixer.clipAction(geometry.animations[0], horse).setDuration(1).startAt(-Math.random()).play();
});
window.navigator.getUserMedia({ audio : true, video: { width: w, height: h }}, function(stream) {
var video = document.createElement(`video`);
video.src = stream;
video.play();
var image = new THREE.VideoTexture(video);
image.generateMipmaps = false;
image.format = THREE.RGBAFormat;
image.maxFilter = THREE.NearestFilter;
image.minFilter = THREE.NearestFilter;
scene.background = image; // 背景視訊紋理
}, null);
animate();
function animate() {
effect.requestAnimationFrame(animate);
if (horse) {
delta = clock.getDelta();
mixer.update(delta);
horse.position.z += horse.speed * delta;
if (horse.position.z > 1000) {
horse.position.z = -1000 - Math.random() * 500;
}
}
control.update();
effect.render(scene, camera);
}
效果展示
很想把螢幕錄製下來,再製成GIF格式的圖片,方便演示,大家有沒有推薦的工具軟體,最好能直接截圖的那種。
演示的效果,大概是這樣子的,一匹馬從遠處跑來,然後再跑到遠處,直至消失。用兩張圖片大概來演示吧。。
暢想
WebAR入門簡單
寫這篇文章的時候,我也想不到,只需要50行程式碼,就可以做一個帶有動畫的ARDemo,不得不說Three.js太強大了。
那問題來了,既然程式碼都是用標準的JS寫的,而且框架用的是開源的Three.js,那WebVRSDK做了什麼?
WebVRSDK是使用C/C++編寫的<跨平臺><極簡><高效能>的<瀏覽器>核心,大小在400K以下,以WebGL為核心,支援WebGL、Canvas、Video、Audio、XMLHttpRequest、VRDisplay、Camera、ImageDecode等等,但不支援Dom,並且為Three.js/Pixi.js/Tiny.js等做了深度相容。
所以,前端開發者,只需要在PC瀏覽器開發、除錯通過,就可以快速的移植到WebVRSDK平臺。
千錘百煉才是精品
我對JS的理解還屬於入門級別,目前寫的Demo,基本都是臨時學的,不要太當真。
想做好WebAR/VR,還需要前端大牛的支援。
如果有好的產品,歡迎移植&對接WebVRSDK。
下一回
新增個按鈕,讓AR可以和使用者互動,但
加個什麼按鈕呢?
點選按鈕之後,顯示什麼效果呢?
敬請期待
相關文章
- 20.WebAR那些事:一個40行的ARDemoWeb
- Java基礎之執行緒那些事Java執行緒
- Node那些事之模組化
- JAVA執行緒的那些事?Java執行緒
- Vue 與 MVVM 之間那些事兒VueMVVM
- python之協程的那些事Python
- PHP基礎之與MySQL那些事PHPMySql
- 《小森生活》製作人:把天馬行空做成遊戲這中間經歷了什麼?遊戲
- 創意天馬行空 心動發行3D視差解謎遊戲《籠中窺夢》3D遊戲
- 多核和多執行緒那些事執行緒
- Java執行緒池的那些事Java執行緒
- MongoDB 那些事(一文以蔽之)MongoDB
- 執行緒與執行緒池的那些事之執行緒池篇(萬字長文)執行緒
- selenium的那些事--執行報錯
- 【QT】 Qt多執行緒的“那些事”QT執行緒
- iOS多執行緒的那些事兒iOS執行緒
- rem那些事REM
- JavaScript那些事JavaScript
- mysql那些事MySql
- GCD那些事GC
- 演算法那些事之冒泡演算法演算法
- Dubbo系列之 (七)網路層那些事(2)
- java高併發之ConcurrentSkipListMap的那些事Java
- Android效能優化(六)之卡頓那些事Android優化
- Java 混淆那些事(六):Android 混淆的那些瑣事JavaAndroid
- MySql索引那些事MySql索引
- ios 面試那些事iOS面試
- babel那些事兒Babel
- PHP那些事兒PHP
- javascript中this那些事JavaScript
- Synchronized的那些事synchronized
- 繼承那些事繼承
- webassembly 的那些事Web
- ViewPager的那些事Viewpager
- 跨域那些事跨域
- OAuth那些事兒OAuth
- Git那些事兒Git
- element-ui原始碼之元件通訊那些事UI原始碼元件