Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
這一節開始,將整理Pano2VR軟件的基本操作,軟件使用版本為:Mac Pano2VR pro 5.0.2-64bit。
感謝持續關注的朋友們,讓我們一起努力愛學習吧!
一、Hello VR&VT
與程序猿開始學習一門語言一樣,第一個demo必然是HelloWorld,那我們的Pano2VR學習也從Hello VR&VT開始。
首先我們要準備一張全景圖,360°或者720°的全景都行,這里我準備了一張720°的全景圖如下所示:
前一篇文章有寫全景圖需要使用全景相機拍攝或者由多張圖片拼接而成,那暫時沒有設備的同學們怎么辦?
答案就是用手機就行,目前市面上也有許多全景合成拍攝的App,例如得圖的“轉轉鳥”就是一款傻瓜式的球形全景相機App。當然用手機App拍攝合成出來的全景圖像質量就各有千秋了,不過用來做demo還是可以的,親測轉轉鳥感覺挺不錯的,最主要的是操作簡單。(ps:強調說明一下,我不是得圖的員工哈~)
有了一張全景圖后,我們來打開Pano2VR軟件進行處理,假設大家也已經完成了破解,軟件打開界面如下所示:
軟件頂部的菜單欄包括Input(導入)、Edit(編輯)、View(視圖)和Tools(工具),中間部分左側區域為導入菜單及參數設置界面,正中間帶網格的(Front)則為我們的全景漫游圖處理區域,中間部分右側區域為導出文件設置界面,軟件底部則為各全景圖像文件預覽區。
下面我們點擊Input選擇導入一張全景圖,導入后正中間的全景圖處理區域則有了預覽效果,我們通過拖動鼠標就可以查看整個漫游全景了,如下圖所示:
接下來我們在右側的導出區域選擇HTML5,然后選擇Generate Output,如果項目還沒有保存會先提示你進行保存,保存后按提示生成相應的導出文件即可。相關的文件導出之后,軟件會自動用瀏覽器打開,我們的Hello VR&VT demo就做出來了,拖動鼠標可以查看全景如下圖:
二、小結
本節內容主要是簡單整理一下Pano2VR生成全景漫游的操作,導出的文件為HTML5格式,全景圖拍攝可以使用手機App進行拍攝合成。接下來的一節,將具體對導入導出文件的相關參數設置,以及導出文件的資源文件進行詳細的整理。
本節完!
8網友裝修日記
08我家網從2008年成立至今,沉淀了1W多篇來自網友真實記錄分享的原創裝修日記,這些日記中分享的寶貴經驗幫助了無數網友順利完成裝修。
今天為同學們分享到的是來自08網友@山水有相逢的日記,他在裝修日記里記錄了自己如何一步步搭建入門級家庭影院。
1.屏幕的選擇
電視的畫質無疑比投影好得多,但是視覺是這樣的,同尺寸二千多的小米不放在八千多的sony邊,一般人應該感覺不到小米有多差,但是屏幕的大小一下就能感受大。所以選擇了能投大屏又相對便宜的投影。
投影又分激光和傳統燈泡投影,激光的超短焦搭配固定抗光幕不適合我家電視柜,激光智能微投性能又相對較差,所以還是選擇了傳統的燈泡投影。
我家電視柜最大能放120寸,再大就沒地方放音箱了,透聲幕也不是我這個入門級玩的,于是尺寸就定在120寸。但是我家做完電視柜后兩面之間只有3米6左右,要投120寸只能用短焦的。1080分辨率的短焦選擇很多,熱門的明基1070,1120都是短焦,但是4k的短焦很少。裝修時水電到入住一般還有段時間,就先埋了支持4k的線,留著120寸幕布的位置。
2.音箱的選擇
以前聽音響論壇的前輩說過,玩聲音是3分器材,7分環境,燒器材燒到最后都會變成燒房子。
我家也沒有專門的影音室,客廳地上還是貼著瓷磚漫反射嚴重,加上高層怕領居投訴,所以什么功率,音質,混響延時,7.1,5.1.2全景聲都不考慮了,唯一的要求就是能聽出前后左右的響聲就行了,俗稱“聽個響”。所以選擇入門的功放+5.1音箱應該就夠了。
3.座椅的選擇
買的功能沙發,芝華士,6千多;隔壁樂至寶2萬多的那套去試坐時短時間也沒試出什么名堂,考慮到家里沙發的利用率不會很高,就選了便宜的。
以上就是大概的搭建想法,投影加支架預算10000,幕布預算3000,音箱加功放預算6000,播放器預算1000,硬盤預算1000,電影片源預算500,預埋線材預算1000,沙發反正要買的不算,搭建一個入門的短焦4k+5.1系統加起來總共大概22500。當然還有很多隱性細節,比如客廳用吊裝投影就不能裝吊燈了,都是要在設計時就考慮進去的。
我家的線材主要是音箱線(喇叭線)和HDMI線。
音箱線買的50米200芯,后來才知道其實入門級買50芯的都足夠了,線太粗反而導致我后面音箱壁掛穿孔時遇到了很大的麻煩。
hdmi線買了兩根,接不同的點,其實這種預埋又容易出問題的線最好一路埋兩根。
我家的布局思路
目前新的功放一般都帶hdmi多路輸入和多路輸出,支持4k@60hz,很適合作為整個系統的中樞。
所以布局時可以把功放放在投影幕布下方的電視柜里,輸入設備如電視機頂盒,高清播放器,游戲機,htpc,nas都可以放在邊上,直接用短的hdmi明線接功放,通過控制功放來切換輸入源。
功放的視頻輸出可以直接接電視,也可以通過預埋的長hdmi暗線走到沙發后面墻上的投影處。功放的音頻輸出通過預埋的音頻線直接通到前面的左中右三個音箱和沙發后面的后置音箱處。低音炮一般會自帶一根特殊的音頻線,可以預留走線的洞連接功放。
5.1的五個無源音箱只需要接音箱線不需要再接電源,只有低音炮的位置要預設電源插座。
▲標準的5個無源音箱擺放方式,低音炮放在前方的任意位置都可以,功放和播放器一般就放在中置音箱附近。
電線方面,主要是記得預先看好投影幕布尺寸,在吊頂邊留好投影幕布和投影儀的電源線。電視柜里面我沒留太多插座,因為考慮到設備多了后肯定要用到智能插座,直接買幾個插線板放柜子里面會更方便。
1.幕布
講起幕布就很心酸,因為物流不上樓,是自己和物業一步步抬上樓的。電梯是不可能進的,即使是走應急樓梯,也幾乎沒有空間了,一路卡著墻上樓,再長10厘米就只能吊上樓了。建議要買的朋友先量下自家樓梯的尺寸。
▲我家選的是這個拉線幕布,相對會比較平整
如果家里準備要裝幕布,要注意三個節點:
1.在設計時考慮燈光問題,客廳吊燈太低會影響吊裝投影,還有幕布那一側有筒燈或射燈的話最好單獨設一個開關,我家就吃了這個虧。
2.在水電定位時就留好電線,預埋暗盒。以前還要預埋幕布和投影聯動的控制線,現在可以用萬能射頻遙控器替代,可以不埋了。
3.在吊頂交底時和木工師傅講好投影凹槽的具體尺寸,不能只留幕布寬度,還要考慮插座的空間。不管幕布是側裝還是頂裝,都要在相應的吊頂處留足夠厚的板子保證能夠承重。
2.播放器
在芝杜z9s、海美迪q5plus之間徘徊了,最后選的芝杜,主要看中他的openwrt系統,可以兼做下載機用。
到手之后發現確實盒子操作比較人性化,一個遙控器就可以完成各類操作,海報匹配,視頻,音軌,字幕,快進快退的設置都很簡單,不像pc上那些播放器難上手。
3.硬盤
4k原盤動不動就80多G,可是大容量機械硬盤一直價格堅挺,為了省錢,把目光投向了亞馬遜海外購。正好碰上免費prime體驗活動,買了個8T和一個20T的,雖然不是歷史低價,但也比國內便宜多了。
1.音箱
本來一直考慮買雅馬哈的音箱,無奈小箱子便宜得讓人不放心,好一點又只有大落地箱,最后選了淘寶比較常見的哈曼卡頓qb30音箱+天龍x550功放的組合。
安裝過程主要是撥音箱線頭,把露出的銅絲插到功放和音箱接線柱,還有打后置音箱的壁掛。整個過程提心吊膽的,生怕預埋的音箱線出問題。
主要遇到三個問題:
1.音箱線太粗了,壁掛支架的孔鉆不進去,最后只能用電鉆暴力擴孔。
2.預埋線沒留標記,功放處五組線不知道哪根接哪里,測試浪費了點時間。
3.后置音響預留的位置太高了,導致有一截線露在外面。
同時音箱附帶了一大堆線材,如果裝修周期不長的朋友可以先買音箱用附帶的線預埋。
選電視柜的時候請一定要注意柜子深度,功放一般都是30多厘米深起步,但是后面的插頭還要占一點空間,我家350深的柜子功放再怎么塞都還是凸出來了一點,至少要做400厘米深。
2.投影支架
這種支架的好處就是哪怕底座裝歪了也能調整回來,缺點就是可調整的地方有六處以上,要一個個部位慢慢固定。
3.投影儀
先推薦個網站,可以模擬各種型號投影儀的安裝尺寸:http://www.reviewtranslations.com/projection_calculator.html
(需復制鏈接到瀏覽器打開)
最后某寶入手:
投影安裝時的兩點心得:
1、是在保持預設畫幅的前提下,投影安裝的位置要讓鏡頭盡量保持在短焦端,離鏡頭的短焦極限點越近,離幕布越近,幕布的亮度就越大;
2、是鏡頭位移功能基本無損畫質,梯形校正功能對畫質影響較大,盡量選擇前者調整;
3、所有投影廠家給的投射距離都是幕布到鏡頭的距離,幕布到墻的距離要加上投影儀本身寬度和投影儀后面插線的空間(至少留8厘米);
4、投影儀的鏡頭一般不在投影儀的正中間,為了鏡頭能對準幕布中間,投影支架要裝偏一點。
注:以上所有產品及信息,均由網友友情分享,具體請自行抉擇。
圖片來源:08我家網編輯助理:愛修下水道的美人魚
跡VR屆的發燒友兼開發者們一定不要錯過這款FaceBook推出的跨端VR開發框架——React360,稱為360全景體驗框架更為準確,因為其前身是FaceBook和Oculus2017年發布的一個叫作“Racet VR”的JS庫,用來在web端創建3D和VR體驗。后來Oculus使用該框架的原生C++版本構建自己部分應用,隨著時間推移,由于要求框架解決不同需求,項目的APIs開始發生分叉。為了避免兩個系統的混淆,開源框架重命名為React360,這更好地反映它的使用場景:創建橫跨PC,移動端,VR設備上的沉浸式360體驗。
可以先看一下官方示例效果,這是一個稍復雜的應用,加入了3D模型,在3D模型和2D面板間共享數據。
體驗
工作原理
官方提供了構建工具react-360-cli,內部使用和ReactNative一樣的打包工具Metro,基于JS Bundle在自己的JS Runtime中進行解析,通過事件機制與客戶端通信,其實該框架還有很多方面相像或依賴于RN。構建一個React360應用程序需要完成兩部分,需要渲染的Raect組件和Runtime定義(這種角色劃分直接借鑒于React Native)。這也很清楚地反映出React360的工作流程,可以參見下圖:
(工作流程圖)
基于JavaScript Core/V8引擎,React360提供了Runtime需要的APIs,在客戶端(頭戴設備,移動端,瀏覽器等)完成構建界面,web端的渲染底層依賴于Three.js,這是業界較為成熟的3D圖形框架,一般需要手動設置3D網格和紋理,而框架中的react-360-web模塊隱藏了這些細節。當創建了新的React組件,框架會指示Runtime將它們添加到3D場景中,當用戶提供輸入將作為事件通過Runtime傳遞給React,這兩部分相互合作形成一個凝合系統。如果想在系統中分享數據,就需要借助框架提供的Native Modules。
需要注意的是,由于JS運作在瀏覽器中是單線程的,應用中任何阻礙行為都有可能造成渲染延遲,這對于VR這種即時性很強的體驗是十分致命的,所以框架將React組件和渲染過程放在分離的上下文中情有可原。
默認情況下,React360使用Web Worker執行你的React代碼,而不是標準瀏覽器,這就意味著在組件定義的文件中訪問不到原生window.location這類APIs。并不是嚴格意義上的無法訪問,事實上當你打印window對象時React360提供了一個DedicatedWorkerGlobalScope類型實例,它包裝了window的一些內容。
Surfaces
Surfaces實際上是一個載體,允許你添加2D內容到3D場景,開發者依據像素定義Surfaces寬高,React360獲取信息產生合適尺寸的對象,官方介紹了兩種類型的Surfaces,Cylinder和Flat。一個Cylinder Surface讓2D內容投射到半徑為4m的Cylinder內部,其實是假想的圓柱模式。一個Flat Surface位于4m半徑的球體外側,一個假想的球體模式。APIs也提供了像yaw(垂搖),pitch(縱搖),roll(橫搖)這些物體自由度控制信息。
為了將React組建附著在Surface上,需要使用AppRegistry注冊組件,又一次與ReactNative相似。這會告知Runtime你的組件通過id字段被唯一確定。
AppRegistry.registerComponent('MyAppName', () => MyAppName);
同時在Runtime文件中引用。
r360.renderToSurface( r360.createRoot('MyAppName'), r360.getDefaultSurface(), 'default' /* 可選項,引用的surface的名稱 */ );
Components
官方提供了呈現2D,3D內容的展示組件和交互按鈕組件。
Layout
支持2D Surface布局,完全以Flexbox格式布局,又是一個和RN相似的點。支持3D Space布局,使用Entity組件時候,通過transform完成3D對象放置,x軸指向用戶右側,y軸指向上方,z軸指向用戶后方。
APIs
官方提供了常見的APIs,例如來自React Native的Animated;鍵值對存儲系統AsyncStorage;值得一提的是提供的ControllerInfo可以被用來響應控制器的connect/disconnect事件,獲取關于所連接的游戲手柄和控制器的靜態信息,比如唯一標識符,按鈕,軸數等信息。環境API Environment用來改變場景的背景,包括圖片,音頻,視頻。
實例解讀
利用react-360-cli生成的項目中主要有這三個文件:
1 import {ReactInstance} from 'react-360-web'; 2 3 function init(bundle, parent, options = {}) { 4 const r360 = new ReactInstance(bundle, parent, { 5 fullScreen: true, 6 ...options, 7 }); 8 9 r360.renderToSurface( 10 r360.createRoot('SlideshowSample', { 11 photos: [ 12 {uri: './static_assets/360_world.jpg', title: '360 World1', format: '2D'}, 13 {uri: './static_assets/360_world2.jpg', title: '360 World2', format: '2D'}, 14 // Add your own 180 / 360 photos to this array, 15 // with an associated title and format 16 ], 17 }), 18 r360.getDefaultSurface(), 19 ); 20 } 21 22 window.React360 = {init};
Native Modules
前面說過React組件運行在單獨上下文中,那么如何與主窗口通信,官方提供了Native Modules模塊,讓React代碼有了回調到Runtime的能力,包括在加載中存值,請求有關連接控制器信息或操縱渲染環境。Native模塊被創建在Runtime代碼中,使用Native Module需要自定義類,繼承自Module,使用前需注冊,這個示例模板代碼演示了Native Modules的許多用法
1 import {Module} from 'react-360-web'; 2 3 class MyModule extends Module { 4 constructor() { 5 // 使這個模塊在NativeModules.MyModule可用 6 super('MyModule'); 7 } 8 9 // 這個方法將被暴露到React應用一側 10 doSomething() { 11 12 } 13 } 14 15 const r360 = new ReactInstance( 16 'MyApp.bundle?platform=vr', 17 document.getElementById('container'), 18 { 19 // 在初始時刻注冊自定義模塊,接收Native Module實例,或一個返回實例的函數(需要傳遞上下文) 20 nativeModules: [ 21 new MyModule(), 22 ctx => new MyModule(ctx) 23 ] 24 } 25 );
通常有兩種使用場景,暴露常量和普通到React(同步),回調函數或返回Promise方法(異步)。這一段代碼同時演示了這幾種使用場景,這是一個發送瀏覽器信息到React側的應用示例,在注冊階段,模塊構造時常量生成并添加模塊實例的userAgent屬性上,這個值被直接傳遞給React。第二個例子是暴露了同步setTitle()方法,只需要一個字符串設置窗口標題欄。剩下兩個異步方法展示了異步數據如何返回到React。當getBatteryLevel()在React側被調用,開發者傳遞的回調在數據可用時觸發,調用上下文提供的invokeCallback,將參數放置在數組中,你可以給回調傳遞任意數量的參數。盡管回調是處理異步任務的一種方式,但我們更偏向于用Promise創建有組織可讀性強的異步邏輯鏈。通過Native Module,你可以使用$符號前綴形式來暴露這種行為,兩個回調ID會作為Promise的resolve, reject自動傳遞給Runtime,該方法會返回一個Promise到調用端。
1 import {Module} from 'react-360-web'; 2 3 export default class BrowserInfoModule extends Module { 4 constructor(ctx) { 5 super('BrowserInfo'); 6 this._rnctx = ctx; 7 this.userAgent = navigator.userAgent; 8 } 9 /* */ 10 setTitle(title) { 11 document.title = title; 12 } 13 14 getBatteryLevel(cb) { // 讀取window信息 15 const getBattery = navigator.mozGetBattery || navigator.getBattery; 16 getBattery 17 .call(navigator) 18 .then( 19 battery => { 20 // extract the level and return it 21 return battery.level; 22 }, 23 e => { 24 // if an error occurs, return null 25 return null; 26 } 27 ) 28 .then(level => { 29 if (this._rnctx) { 30 this._rnctx.invokeCallback(cb, [level]); 31 } 32 }); 33 } 34 35 $getConfirmation(message, resolve, reject) { 36 const result = window.confirm(message); 37 if (this._rnctx) { 38 if (result) { 39 this._rnctx.invokeCallback(resolve, []); 40 } else { 41 // When rejecting a Promise, a message should be provided to populate 42 // the Error object on the React side 43 this._rnctx.invokeCallback(reject, [{message: 'Canceled the dialog'}]); 44 } 45 } 46 } 47 }
后記
對于React360的整體一覽,官方文檔還是對在web端介紹比較多,官方開發團隊在GitHub也比較活躍,所以有問題可以及時issue都會有人回復。Facebook在幾年前收購了Oculus足已看出其進軍VR屆的雄心已經初見倪端,目前市面上許多APP對360全景圖的應用也萬象回春,微博的全景圖借助手機的陀螺儀和重力傳感器在不點擊圖片詳情的情況下跟隨用戶手勢動態變化,自如的VR看房,在我們APP里也引入了全景酒店實景體驗。在昂貴的VR設備消費者負擔不起的情況下,360度全境體驗正是VR在當今階段最普及的形態,雖然只是純粹的平面圖像,卻也一定程度上營造了沉浸式感受,而React360在靜態全景的基礎上引入了多種交互,這更加方便消費者了解需求,相信360全景的未來還能做得更多。
在這里我相信有很多想要學習前端的小伙伴,我自己是一名從事了多年開發的前端老架構師,辭職目前在做自己的前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的前端學習干貨,從最基礎的html到js各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。