VR全景視圖 Google VrPanoramaView

1、背景簡介

Welcome to VR at Googleandroid


進入Google VR主頁,發現官方給咱們提供了兩套解決觀看VR視頻的方式:ios

 

給咱們提供了三個平臺的API,分別是:Unity 3DAndroidIOS面試

下面看一下官方給這兩種方式的描述(
Daydream小程序

 

Daydream is a platform for high quality, mobile virtual reality.api

白日夢是高質量,移動虛擬現實的平臺。在主頁上方官方也描述它爲:低延遲,身臨其境的,互動的移動VR的新平臺性能優化

Cardboard網絡

 

Cardboard lets you experience virtual reality in a simple, fun, and affordable way.架構

紙板可讓你在負擔得起的狀況下,體驗一個簡單,有趣的虛擬現實。在主頁上方官方也描述它爲:是世界上最流行的和方便的移動VR平臺(多是經濟成本低吧)

  • 2014年:Google在當年的Google I/O大會上宣佈,其將開發紙盒版的HMD(頭盔式顯示器),年末該設備銷量達到了50萬。

  • 2015年:Cardboard被大公司所接受,Google將那些刻上了品牌商標的Cardboard分發給了各大合做商,消費者繼續購買主題化的HMD。此時,Cardboard的發展又到了另外一個高度:銷量達到100萬。

  • 2016年:在今年的Google I/O大會上,Google宣佈Cardboard銷量已達到500萬部,但與此同時,Google推出了Daydream——一個更高級的移動VR HMD,並將於今年11月進入市場。現在市場上已經產生了成千上萬的Cardboard應用,Google Play store上的Cardboard app安裝量達到50萬至100萬次。

Daydream is a much higher end VR experience. I have Cardboard, and it's neat, but in some ways, it feels like a tech demo. (白日夢是一個更高的終端虛擬現實體驗。紙板,它很簡潔,但在某些方面,感受技術演示。)
那麼就此看來,應該是這樣的狀況:Cardboard是Google先推出的簡陋版/測試版/經濟適用版,如今佔用了很大市場;Daydream 是今年新推出的豪華版/完善版/高端玩家版,會衝擊Cardboard的市場。也就是說Cardboard短時間不會死 ,Daydream還在發展中。

介紹

官方在這裏介紹了VR view 、支持平臺等。我挑幾個相對重要的介紹一下:

一、圖像規格
VR查看圖像能夠保存爲PNG,JPEG或GIF。Google建議使用JPEG改進壓縮。 爲了得到最大的兼容性和性能,圖像尺寸應該是2的倍數(例如,2048或4096)。單個圖像應爲2:1縱橫比(例如4096×2048)。 立體圖像應爲1:1縱橫比(例如4096×4096)。

如圖:

 

案列

首先下載Demo,
https://github.com/googlevr/gvr-android-sdk

項目(gvr-android-sdk )中有幾個主要目錄能夠留意一下:

  • libraries

  • ndk-beta

  • samples

  • samples目錄中有四個Demo,分別是:

  • SDK-controllerclient(Daydream的控制端)

  • SDK-simplepanowidget(全景圖)

  • SDK-simplevideowidget(全景視頻 也就是VR視頻)

  • SDK-treasurehunt(尋寶項目)

注意:運行環境必須是api19以上的手機,也就是Android4.4及以上

VrPanoramaView(VR全景視圖)的實現

一、添加依賴

compile 'com.google.vr:sdk-panowidget:1.40.0'

二、權限

<uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

三、佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.zx.vrview.MainActivity">

    <com.google.vr.sdk.widgets.pano.VrPanoramaView
        android:id="@+id/vrPanoramaView"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:scrollbars="none"/>


</LinearLayout>

四、activity

/**
 * VR全景視圖(圖片查看器)
 */
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private VrPanoramaView paNormalView;
    private VrPanoramaView.Options paNormalOptions;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initVrPaNormalView();
    }

    @Override
    protected void onPause() {
        super.onPause();
        paNormalView.pauseRendering();
    }

    @Override
    protected void onResume() {
        super.onResume();
        paNormalView.resumeRendering();
    }

    @Override
    protected void onDestroy() {
        // Destroy the widget and free memory.
        super.onDestroy();
        paNormalView.shutdown();
    }


    //初始化VR圖片
    private void initVrPaNormalView() {
        paNormalView = (VrPanoramaView) findViewById(R.id.vrPanoramaView);
        paNormalOptions = new VrPanoramaView.Options();
        paNormalOptions.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
//        paNormalView.setFullscreenButtonEnabled (false); //隱藏全屏模式按鈕
        paNormalView.setInfoButtonEnabled(false); //設置隱藏最左邊信息的按鈕
        paNormalView.setStereoModeButtonEnabled(false); //設置隱藏立體模型的按鈕
        paNormalView.setEventListener(new ActivityEventListener()); //設置監聽
        //加載本地的圖片源
        paNormalView.loadImageFromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.andes), paNormalOptions);
        //設置網絡圖片源
//        panoWidgetView.loadImageFromByteArray();
    }

    private class ActivityEventListener extends VrPanoramaEventListener {
        @Override
        public void onLoadSuccess() {//圖片加載成功
            Log.i(TAG, "onLoadSuccess------------>");
        }


        @Override
        public void onLoadError(String errorMessage) {//圖片加載失敗
            Log.i(TAG, "Error loading pano:------------> " + errorMessage);
        }

        @Override
        public void onClick() {//當咱們點擊了VrPanoramaView 時候出發
            super.onClick();
            Log.i(TAG, "onClick------------>");
        }

        @Override
        public void onDisplayModeChanged(int newDisplayMode) {
            //改變顯示模式時候出發(全屏模式和紙板模式)
            super.onDisplayModeChanged(newDisplayMode);
            Log.i(TAG, "onDisplayModeChanged------------>" + newDisplayMode);
        }
    }
}

代碼分析

這個栗子中須要注意幾個知識點:

VrPanoramaView //Google提供給咱們現實全景圖片的View
 Options //VrPanoramaView 所需的設置
 VrPanoramaEventListener//爲 VrPanoramaView 設置監聽
 loadImageFromBitmap//加載圖片的主要方法

Options

接下來看看剛剛的VrPanoramaView.Options吧,上文中 是這麼設置的

panoOptions.inputType = Options.TYPE_STEREO_OVER_UNDER;

那麼爲何要這樣設置呢?先看官方對Options中標籤的介紹:

  • public static final int TYPE_MONO = 1;
    圖像被預期以覆蓋沿着其水平軸360度,而垂直範圍是根據圖像的寬高比來計算。例如,若是一個1000x250像素的圖像,給出所述全景將覆蓋360x90度與垂直範圍是-45至+45度。

  • public static final int TYPE_STEREO_OVER_UNDER = 2;
    包含兩個大小相等的投影 全景圖垂直疊加。頂部圖像被顯示給左眼、底部圖像被顯示給右眼。//看下圖你就懂了

圖像將覆蓋沿水平軸360度,而垂直範圍是根據圖像的寬高比來計算。例如,若是一個1000x500像素的圖像中

這裏寫圖片描述

我要顯示的圖片是下圖這樣的,因此就要設置爲 'TYPE_STEREO_OVER_UNDER'

 

這裏寫圖片描述

那麼什麼樣的圖片設置爲 'TYPE_MONO' 呢?請看:

 

這裏寫圖片描述

不知道有沒有眼神好的同窗發現這個問題:TYPE_STEREO_OVER_UNDER類型的圖片每次切換模式時候 圖片中間都會有一條垂直於水平線的分割線(很淺 很淺 而後逐漸消失),

總結

總結下如何在Android設備上用Google的SDK作一款全景圖的顯示器(播放器?查看器?... 不知道叫什麼合適):

  • 導入google的庫

  • 在相應的佈局文件中引入控件com.google.vr.sdk.widgets.pano.VrPanoramaView

  • 初始化控件

  • 爲VrPanoramaView設置options

  • 找到圖片的Bitmap

  • 調用VrPanoramaView的loadImageFromBitmap方法

  • 在onPause、onResume、onDestroy中作出相應處理

最後給你們分享一份很是系統和全面的Android進階技術大綱及進階資料,及面試題集

想學習更多Android知識,請加入Android技術開發企鵝交流 7520 16839

進羣與大牛們一塊兒討論,還可獲取Android高級架構資料、源碼、筆記、視頻

包括 高級UI、Gradle、RxJava、小程序、Hybrid、移動架構、React Native、性能優化等全面的Android高級實踐技術講解性能優化架構思惟導圖,和BATJ面試題及答案!

羣裏免費分享給有須要的朋友,但願可以幫助一些在這個行業發展迷茫的,或者想系統深刻提高以及困於瓶頸的朋友,在網上博客論壇等地方少花些時間找資料,把有限的時間,真正花在學習上,因此我在這免費分享一些架構資料及給你們。但願在這些資料中都有你須要的內容。

相關文章
相關標籤/搜索