前言
有一篇文章我說了H5實現全景圖預覽,全景視頻播放的原理,有需要的小伙伴可以自行去看一下
今天我就拿出我的實踐干貨出來,本人實測實測過
需求
老板:我需要可以上傳全景圖片,然后手機網站上都可以360度看全景圖
需求分析
一個上傳功能
一個全景360度預覽功能
正文
H5 上傳功能就不說了,或下一篇文章說。
H5 有幾種方式實現呢?
第一種方案:three.js(大哥出山吧)
作為前端界全景、3D大哥,大哥請開始你的表演
官方地址:https://threejs.org/
官方案例:https://threejs.org/examples/#css3d_panorama
源碼:簡單,引入three,引入3d
實現:2:1的全景在PC端,可以預覽,左右上下 鼠標移動
優點:aaaaa,我說不出口
缺點:PC端不能放大縮小,圖片需要裁剪六張,移動端,不能放大縮小,更加糟糕的是渲染滴很差,截圖為證,手機也是如此(此方案 涼涼 不符合需求)
大哥,就這樣跪了嗎?我沒有深入的研究three,可能他的強大我沒有用上吧
剛開始我用的是,node+three 竟然沒有 CSS3DRenderer 安裝包 ,只有2D的 並且引用three 也是報各種錯誤
放一個我引入成功的示范:import * as THREE from "three";
官方實例的靜態頁面,跟官方一個效果,但是不是我想要的;我不想切六張圖,還有渲染也不好,圖中出現黑色這是我們老板打死也不能接受的。是我沒有深入了解
本例子,不接受反駁,有能力的自己去研究。反正我是沒有這個本事
總之,這個我能力不夠,搞不定
放一下源碼:
貌似有點多啊~ 你們還是去官網找吧,找不到私信一下
第二種方案:aframe
官方地址:https://aframe.io/
官方案例:https://aframe.io/examples/showcase/sky/
源碼:真是太簡單了,引入aframe 框架, <a-sky></a-sky>
實現:2:1的全景在PC端,可以預覽,左右上下 鼠標移動,還支持VR模式,
優點:簡單方便,一頓操作猛於虎
缺點:PC端不能放大縮小,移動端只能左右移動,不能放大縮小,不能上下滑動(此方案 涼涼 不符合需求)
<html> <head> <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script> </head> <body> <body> <a-scene> <a-sky src="img/po.jpg" rotation="0 -130 0"></a-sky> </a-scene> </body> </body> </html>
第三種方案:jQuery 插件——vrview
是時候要我們的jQuery大哥出場了,萬能的插件快來解救我吧!!!
嘗試了大概不下五個插件,效果都不盡人意,
不是打不開,就是不太符合我的需求,還有就是像素加載處理很差
看到這里是不是很絕望,反正我是的(引入jQuery 代碼都不想放出來了 你們自己找吧,無非就是引用插件 引用圖片)
希望大家可以找到符合你們需求的插件吧
江湖再見
第四種方案:pannellum(宛如我的救星,是國外的一個框架)
官方地址:https://pannellum.org/
官方案例:https://pannellum.org/documentation/overview/
源碼:引用同樣是so easy!
實現:2:1的全景在PC端,可以預覽,左右上下鼠標移動,能夠放大縮小,移動端也完美具備這些需求,完全符合我的需求,跪謝
優點:簡單方便,一頓操作猛於虎
缺點:由於webGL的限制,圖片寬度最大限制是4086,圖片由於燈光有點失真,更加悲劇的是放大的時候,有鋸齒(圖片裁剪算法問題)
這都差不多了,但是新的問題好像很難啊
用了很渣的英文問了作者,作者告知是圖片裁剪算法問題
厚着臉皮要后端小哥哥,用bicubic和 Lanczos 幫我裁剪圖片
然而事實,在移動端有鋸齒,特別的失真(哇的哭了,老板然后各種發移動端別人做的沒有鋸齒的網頁版全景圖)
這一刻,我真的絕望了
絕望后,我再補充一下
我用了4096 沒有裁剪的圖,其實圖片還是有鋸齒的(放大最大限度)怎么表達這個鋸齒呢(像素)
你肯定會想說 放大圖片本來就有像素點啊!
好像這個框架圖片算法處理的不夠好(移動端),pc端很不錯
我們老板的大光頭 (我還是放圖吧)
emmmmmmmmmmmmmmmmmmmmmmmmmm
再怎么說,代碼還是要貼出來
<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title></title> <link rel="stylesheet" href="js/pannellum.css"/> <script type="text/javascript" src="js/pannellum.js"></script> <style> #panorama { width: 100%; height: 100%; } *{ margin:0; padding:0; } </style> </head> <body> <div id="panorama"></div> <!-- <canvas id="canvas" style="display:none"></canvas> --> <script> pannellum.viewer('panorama', { "type": "equirectangular", "panorama": url, "autoLoad": true, }); </script> </body> </html>
第五種方案:Krpano(大哥 真的就靠你了)
吃完飯,左思右想。我還是換一種方案吧(我們老板堅決不接受鋸齒)
啊啊啊啊啊啊~我記得Krpano 是要用工具才可以的啊
聽說上手很難啊~xml 寫的 收費的
官方地址:https://krpano.com/
中文教程:http://www.krpano360.com/
實現:2:1的全景在PC端,可以預覽,左右上下鼠標移動,能夠放大縮小,移動端也完美具備這些需求,完全符合我的需求,並且沒有鋸齒
跟着教程走一遍,你就知道原理了
然后呢,自己跑一個案例,其實非常的簡單,我覺得,之前都是謠言
簡單原理:准備一張全景圖,把全景圖拖入它的工具中,,生成一個文件夾,用
本地服務。完美
開開心心到這里,發現事情並沒有這么簡單
這是靜態圖片的制作,我是動態圖片啊~用戶上傳的全景圖啊(我滴個乖乖)
恩,不能慌這個時候,我理一下思路(關鍵字是,Krpano功能化,你會發現其實很多全景圖公司 底層都是用Krpano)
第一種:用戶上傳,拿到上傳到了服務器的地址,用node下載下來圖,node操作.bat 生成文件夾,然后把整個文件夾提交到服務器~這樣子 貌似資源消耗很大啊
第二種:我看到官方有linux版本,java來實現更好。前端只負責上傳,返回html,跳轉
后端在linux部署Krpano環境,然后返回給前端就好
我們公司采用的是第二種,后端來處理這些,我前端突然不用做什么了(一臉懵逼 一臉懵逼 再加上生無可戀啊)
20190921 補充
我們公司是買了技術支持的 開通了會員(現在想想 不太值得 技術支持只有在我做全景VR視頻的時候 咨詢過如何動態換視頻地址)
會員的教程 很久都沒有更新了 17年有一些留言和回復 18 19年 很少了。
英語能力好的 建議直接看官方文檔(就醬紫)
我這里面居然沒有寫如何做VR全景視頻的 后期可以來一篇
但是最終是解決了這些問題,也可以說是什么都沒有解決
今天下午老板拿出去 吹牛逼了,不知道效果如何(保佑我 阿門)
······~~~~
效果相當的滿意,並且我們公司那些做場景的都用我的寫的。啊 幸福來得好突然
全景圖,我來來回回,把網上的資料都翻遍了。你要是有什么其他難點,說不定我看見過解決方案,也可以一起交流
總結
fannie式總結,全景圖大概就說這些,我這些還是很簡單的使用全景圖,靜態引用
並沒有點擊換下一個場景,但是我上面遇到的問題,這些解決了,才好解決接下來的坑
或許我們后期還會深入全景圖
不過,前端還是可以分分鍾鍾在小程序,公眾號 可以做到跨平台全景圖
PC端的支持是最好的,移動端還是需要發展
就到這里吧!覺得可以的就點贊,有意見的在底下評論,不要噴的太厲害了,最近搞這個搞的頭大。