Pico Neo 开发配置

  VR 一体机内置操作系统,是具备独立处理器的 VR 头戴式显示设备。VR 一体机具备独立运算、输入和输出的功能不如主机式 VR 设备强大,但由于没有连线的束缚,使用起来自由度更高。

  VR 一体机作为市面上应用最为广泛的虚拟现实设备,是虚拟现实应用开发的主要设备。典型的 VR 一体机设备为 Oculus Quest 2、Pico Neo 2,这里以 Pico Neo 为例介绍 VR 一体机设备的应用开发。


1.设备介绍

  Pico Neo 是市面上较为流行的头戴式 VR 一体机,具备较好的性能,在这个部分,我们将介绍如何利用 Unity 进行 Pico Neo 的应用开发。

  Pico Neo 硬件部分主要包括头盔和操作手柄,在进行开发时我们需要熟悉一下硬件部分的使用。

  通过长按头盔的电源键的方式我们可以打开头盔,打开头盔后,通过按下手柄的 HOME 键连接手柄。

头盔和手柄的开机操作

  在利用头戴式显示设备开发前,需要先了解一下相应的游戏引擎。目前市面上有很多优秀的商用游戏引擎和免费游戏引擎,其中最具代表性的商用游戏引擎有 Unreal 和 Unity。
  Unity 是由 Unity Technologies 公司开发的跨平台专业游戏引擎,用户可以通过它轻松实现诸如 3D 游戏、建筑可视化、实时三维动画等类型互动内容,然后一键部署到各种游戏平台上。
  Unity 以其强大的跨平台特性与优秀的 3D 渲染效果而深受广大开发者的青睐,现在很多商业游戏及虚拟现实产品都采用 Unity 引擎来开发。

  Unreal 是 Unreal Engine 的简写,中文名为虚幻,由 Epic 开发,是世界知名授权最广的游戏引擎之一。Unreal Engine 是全球最开放、最先进的实时 3D 创建工具,可制作照片级逼真的视觉效果和沉浸式体验。
  虚幻引擎是一套完整的开发工具,面向所有使用实时技术的开发者。它能为各行各业的专业人士带去无限的创作自由和空前的掌控力。无论是前沿娱乐内容、精美的可视化还是沉浸式虚拟世界,一切尽在虚拟引擎。


2.软件配置

  由于 Pico Neo 是基于 Android 平台的,因此开发者在利用 Unity 进行开发时,需要在 Unity 中添加相应的 Android 平台的支持模块。如果安装 Unity 时没有安装,可以在 Unity Hub 中进行相应模块的添加。

  在 Unity Hub 中点击进入安装界面,选择相对应的 Unity 编辑器,点击其左上方的更多按钮,在界面中选择添加模块。

添加模块

  在添加模块界面选择Android Build Support模块并安装。

添加 Android Build Support

  利用搜索引擎搜索 Pico 找到相应页面的方式或者直接通过网址 https://www.pico-interactive.com/cn/,直接进入 Pico 的官方网站。点击网站上方的开发平台进入 Pico 开发者平台。

Pico 官方网站

  在 Pico 开发者平台页面点击下载 SDK,进入 SDK 界面,如下图所示。

Pico 开发者平台

  在下载 SDK 界面中选择开发所采用的 Pico Neo 2 series 以及相对应的开发平台 Unity。选择好相应的事项,点击页面下方的下载最新版进行 SDK 下载。

下载 PicoVR Unity SDK

  在 Unity Hub 中新建一个 Unity 工程,新建工程完成后,选择 Assets 菜单中的 Import Package 点击 Custom Package。

导入 Custom Package

  点击 Custom Package 后,在弹出的文件资源管理器中,选择下载好的 PicoVR Unity SDK。SDK 有 32bit 和 64bit 两个版本,开发者根据自身设备选择相应版本。

选择相应版本的 SDK

  点击打开后,系统会弹出一个对话框,开发者可以根据需要导入相应的部分,如下图所示。

导入选项

  等待 SDK 导入完成,在弹出的 Pico SDK Setting 窗口,修改相应的设置,修改完成后点击下方的 “Apply” 后,关闭窗口。

Pico SDK Setting

3.演示示例

  在 Unity 的 Asset Store 搜索 “POLYGON Starter Pack” 点击Import将资源包导入项目。

导入 Asset Store 中的资源包

  找到资源包中的场景文件,双击进入资源包中的场景。

选择资源包中的场景

  进入 Project 选项卡,依次展开 Assets 中的 PicoMobileSDK,找到Pvr_UnitySDK,打开 Pvr_Unity 文件夹选择其中的 Prefabs,将 Pvr_UnitySDK 预制体拖放入场景。

Pvr_UnitySDK

  Pvr_UnitySDK 是一个集成式的预制体,能够跟踪头戴式显示器,在创建项目时,可以直接将 Pvr_UnitySDK 预制体拖放至场景中。

  将原场景中的摄像机删除,并调整好 Pvr_UnitySDK 的位置。调整好位置后,点击运行可以查看场景的双目视图预览。

场景的 Game 视图

  开发者可以通过键盘上的 Alt 键和鼠标左键进行运行视图的切换,开发者根据自身需要可以选择视图在 Game 面板的呈现方式,也即双目视图和单目全屏之间的切换。通过键盘上 Alt 键和鼠标的移动,开发者可以改变相机的朝向,以此查看场景。

  接着找到 Assets 下的 Pvr_Controller 中的 Prefabs,选择其中的 ControllerManager,如下图所示。

Project 中的 ControllerManager

  ControllerManager 主要包含 PvrController0 和 PvrController1,这两个预制体主要对应于两个手柄。对于部分单手柄的设备,可以只使用其中的 PvrController0。将 ControllerManager 预制体拖放至 Pvr_UnitySDK 下,作为 Pvr_UnitySDK 的子物体。

ControllerManager

  拖放完成后,点击运行。在 Game 视图中,可以看到两个白色透明手柄的模型。

添加 ControllerManager 后的运行显示图

  显示手柄后,我们需要利用手柄与场景进行交互,使用操作手柄的按键与摇杆之前需要了解手柄的相应按键的作用,以及对应的接口 API。操作手柄主要包含 HOME 键、操作键、摇杆、侧按键以及扳机键,这些键在不同应用中常对应着不同的功能。在开发过程中,我们根据需求自定义按键对应的功能,并为此编写相应的响应事件处理程序,来实现手柄按键与应用的交互。

手柄按键示意图

  在应用开发时,我们常常需要根据手柄的接口 API,对手柄的按键进行配置,利用接口 API 实现相应的交互,例如响应手柄按下事件等。下表即为 Pico Neo 不同按键对应的输入事件。

按键 输入事件
HOME键 Pvr_KeyCode.HOME
APP返回键 Pvr_KeyCode.APP
扳机键 Pvr_KeyCode.TRIGGER
侧按键 Pvr_KeyCode.Right(手柄1为Right)
Pvr_KeyCode.Left(手柄0为left)
摇杆 Pvr_KeyCode.TOUCHPAD
X键 Pvr_KeyCode.X(手柄0)
Y键 Pvr_KeyCode.Y(手柄0)
A键 Pvr_KeyCode.A(手柄1)
B键 Pvr_KeyCode.B(手柄1)

  通过将按键对应的输入事件与 API 接口函数相结合使用,即可通过脚本获取手柄的交互信息。

  通过 UPvr_GetControllerState 函数能够获取 Controller 连接状态,可以用来判断手柄控制器是否连接并且能够使用。

UPvr_GetControllerState 函数详解

  结合上图中 UPvr_GetControllerState 函数的定义,我们可以发现函数的返回值为 ControllerState 类型,ControllerState 为枚举类型,包含三种状态,Connected 即为连接成功。

ControllerState

  同样的,我们可以利用 UPvr_GetKey 函数获取手柄控制器的按键是否被按住,UPvr_GetKey 函数如下所示。在调用函数时,我们需要指定手柄控制器(hand),以及需要检测的按键(key)。通过函数的返回值我们可以知道相应的按键是否被按住,按键被按住即返回 true,按键未按住即返回 false。

UPvr_GetKey 函数详解

  介绍了上述接口函数,我们在项目中新建文件夹,并命名为 Scripts,在 Scripts 文件夹中新建脚本并命名为 ControllerDemo。利用这个脚本演示相应函数的使用。

新建脚本

  双击打开脚本,在脚本中添加相应的检测代码如下所示。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Pvr_UnitySDKAPI;

public class PicoControllerDemo : MonoBehaviour
{
    void Update()
    {
        if(Controller.UPvr_GetControllerState(0) == ControllerState.Connected)
            if(Controller.UPvr_GetKey(0, Pvr_KeyCode.TRIGGER))
                Debug.Log("正在按Trigger键!");
    }
}

  在脚本中,我们在if条件语句的判断条件中填入表达式,利用 UPvr_GetControllerState 判断 PvrController0 是否接入成功。如果接入成功,再利用 if 语句结合 UPvr_GetKey 判断指定手柄控制器的 Trigger 键是否被按住。

  相应的函数调用时通过传入 0/1 的方式来指定函数判断相应手柄控制器,根据传入的相应按键判断按键是否被按下。

  在 API 函数中,还用两个函数 UPvr_GetKeyDown、UPvr_GetKeyUp 来判断按键的状态。UPvr_GetKeyDown 函数可以判断按键是否被按下,UPvr_GetKeyUp 可以用来判断按键是否被抬起。

UPvr_GetKeyDown 和 UPvr_GetKeyUp 函数详解

  这两个函数和前面介绍的函数类似,传入参数为 hand 和 key,这两个参数即为指定手柄控制器和手柄控制器的按键。

  Pico Neo 2 的手柄控制器中包含摇杆键,对于摇杆不能和其他按键一样。摇杆与触摸板类似,拨动摇杆的值和触摸板的值类似。在早期版本中,获取触摸板的主要利用 UPvr_GetTouchPadPosition 函数获取触摸板的 touch 值。后来,触摸板和摇杆样式的操作手柄进行统一,统一利用 UPvr_GetAxis2D 函数。

不同样式的操作手柄

  在触摸板上,以触摸板的中心为坐标中心,建立一个 -1 到 1 的两个坐标轴,手指触摸触摸板的相应位置,坐标轴能够得到相应的触摸位置。摇杆也可以和触摸板一样,利用类似的原理,可以获取摇杆的拨动值,如下图所示。

触摸板示意图

  在 API 函数中,可以利用 UPvr_GetAxis2D 函数,获取摇杆的拨动值。UPvr_GetAxis2D 函数需要传入 hand,也即指明操作手柄。UPvr_GetAxis2D 函数的返回值为二维向量(Vector2),返回值的范围为 -1 到 1。

UPvr_GetAxis2D 函数详解

  Pico 一体机除了手柄按键,头戴式显示器上也有相应的按键。下表列出了一体机头戴式显示器上的常用按键与 Unity 里的键值对应关系。

HMD按键 Unity输入键
返回值 KeyCode.Escape
确认值 KeyCode.JoystickButton0

  头戴式显示器同手柄控制器按键类似,可以使用相应的同手柄按键类似的 API 接口函数,检测头戴式显示器上的按键状态。

  需要注意的是,头戴式显示器的按键与操作手柄的按键的接口 API 函数使用存在不同,操作手柄的 API 接口函数的调用需要使用 Controller,对于头戴式显示器的按键的使用是通过 Input 输入系统。

  类似的,我们可以编写脚本结合 if 判断语句判断相应的按键的使用情况,对于相应的按键可以按照按键对应的事件的对照表指定相应的按键。

if(Input.GetKeyDown(KeyCode.Joystick1Button0))
{
    Debug.Log(“头戴式显示器确认键被按下!”);
}

  在脚本中编写相应的内容后,将脚本挂载到游戏场景中的物体上,由于脚本内容需要和手柄控制器进行交互。因此编写完成相应的脚本后,需要结合设备进行相应的调试,脚本的完整内容如下所示。

public class ControllerDemo : MonoBehaviour
{
    void Update()
    {
        if (Controller.UPvr_GetControllerState(0) == ControllerState.Connected)
        {
            if (Controller.UPvr_GetKey(0, Pvr_KeyCode.TRIGGER))
                Debug.Log("正在按Trigger键!");

            if (Controller.UPvr_GetKeyDown(0, Pvr_KeyCode.TRIGGER))
                Debug.Log("Trigger键被按下!");

            if (Controller.UPvr_GetKeyUp(0, Pvr_KeyCode.TRIGGER))
                Debug.Log("Trigger键被松开!");

            Vector2 DialValue = Controller.UPvr_GetAxis2D(0);
            Debug.Log("摇杆的拨动值:" + DialValue);            
        }

        if (Input.GetKeyDown(KeyCode.Joystick1Button0))
            Debug.Log("头戴式显示器确认键被按下!");
    }
}

  在进行调试时,需要事先对项目进行打包。在 Unity 编辑器中,通过 Unity 上方菜单栏中的 File 下的 Build Settings 进入项目打包界面。

File 菜单栏

  通过 Build Settings 进入项目打包界面后,点击界面上 “Add Open Scenes”,添加当前场景进入打包列表。在下方的 Platform 中选择 Android,点击界面的左下角的 “Player Settings” 进入玩家设置界面。

项目打包界面

  在 Player Settings 界面中,选择 Other Settings,在 Other Settings 界面中修改 PackageName,同时 Minimum API Level 和 Target API Level 选择相对应版本的 API level。

Player Settings 界面

  将头戴式显示器与电脑上处于同一个局域网下或者通过数据线将设备与电脑进行连接,等待设备接入完成后,在 Build Settings 界面中点击 “Refresh”。刷新完成后,在 Run Device 中添加 Pico Neo 2 即可指定运行设备。

添加运行设备

  修改完相应设置后,点击界面右下角的 “Build And Run”(也可以点击 Build 后续再在 Pico 设备中点击运行),在弹出来的文件资源管理器中新建文件夹 AndroidPackage 并将打包好的 apk 文件命名后存入指定的文件夹。

将 apk 文件存放至指定文件夹
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容