HTC Vive开发笔记之UI Guideline

本文转自HTC官方论坛,原址https://www.htcvive.com/cn/forum/chat.php?mod=viewthread&tid=1641&extra=page=1。

在过去,3D程序多数是游戏,非游戏的应用一般设计成2D程序。而在VR中几乎所有程序都是3D的(左右眼需要看到的不一样画面),所以开发VR程序和开发3D游戏很像,也可以使用Unity, Unreal等引擎。而VR开发的独特之处在于UI设计,如果还用之前的方案,用户使用的时候可能会觉得非常困惑甚至头晕。这篇文章会给大家介绍设计VR中UI的一些常用做法。

## HUD?

### 什么是HUD

HUD (head-up display)是非VR游戏中最常见的UI类型。它的用处是实时显示状态和提供按钮、输入框等控件。比如在游戏中显示生命值、弹药数、分数、小地图,以及技能按钮、菜单按钮等,都会用到HUD。

### 为什么不能在VR中使用HUD

HUD的实现方式是在游戏画面之上覆盖一层专用的HUD画面(overlay)。它有两个特点:

1. HUD画面是离摄像机镜头最近的物体,其他物体都会被HUD挡住 
    
    2. HUD在屏幕中位置是不变的,且很多组件在屏幕的边缘 
    
而这两点在VR中都是很难被接受的。首先,如果距离太近,会让用户的眼睛无法聚焦。其次,VR中的屏幕不是矩形的,边缘一般比较模糊,所以把UI放在边缘会看不清楚;而且如果位置还是固定的,不受视野控制,那就更不自然了 ———— 用户会因为看不清楚而本能地转头去看,而即使转头,它的位置还是在边缘。

### 用什么替代HUD

答案是立体UI。也就是说UI不再集中于一个平面。比如用户在观察一件展品时,展品的上方漂浮着一段文字描述(也可以是图片、视频),这种UI和虚拟世界中物体联系很紧密,用户能很直观地感受到它在描述哪件物品;还有种做法是在不遮挡视野的地方显示信息。比如在远方的天空放置一个平板,用户一抬头就能从上面看到当前场景的信息以及得分情况。这种UI适合展示不需要经常查看的信息。

如果要显示和场景中物体无关而且需要经常查看的UI,就需要用到Vive手柄了。举几个例子,Tilt Brush中右手是画笔,而左手是调色板(一共有4个功能不同的面板,比如调色、更换画笔和场景、存储照片等等,通过旋转左手可以看到不同的面板);Raw Data中手枪上有个数字显示剩余弹药(漂浮的3D文字);在Budget Cuts中,点击菜单键后手柄上会出现一个物体栏(物品栏中会出现现有物品的模型,可以用另一只手把它们拿出来)。注意,这些UI元素的形状也是立体的,它们有的是3D文字,有的是模型。

## 与场景互动

### Vive手柄介绍

除了视野和位置的控制是由头盔完成,Vive的主要输入方式是通过手柄。手柄在输入方面一是提供手的定位和定向,使得玩家的双手的位置、手柄的方向、手心的朝向都可以体现在VR中;二是提供了这几个按键:

1. 扳机键 (trigger):最重要的按键,相当于键盘上的回车键。一般单击用于确认选择、开枪;按住不动用来拖拽、给气球打气,持续地开枪等等。

2. 侧键 (grip): 用得频率较少,可以用来实现紧握,比如紧握一根树枝。也可以用来激活物品或者触发事件。

3. 菜单键 (application menu):最好用来弹出菜单。比如程序或者游戏的设置菜单、物品栏。

4. 触摸板 (touchpad): 最灵活的按键。硬件上它支持的功能有两个:获得触摸点的坐标以及响应按键消息。这个键很重要,因为:

a. 相比其他的按键,它不但能知道用户何时按下了按键,还能知道手指在什么位置按下的(通过一个二维坐标,x,y的取值范围都是[-1, 1]) 
    
    b. 即使不按下这个键,也能获得触摸点坐标,因此可以用于做简单的手势识别(比如上划、右划) 
    
    c. 这个键用拇指按很轻松。

在现有的应用中,触摸板被用来换子弹、选择技能、更换工具、调节音量、瞬移(teleport)。

5. 系统键 (system button): 这个键是用来开启手柄电源以及呼叫系统菜单的,设计程序时一般情况下不要用到它。

### 选择物体

1. 激光选择。从手柄(或者其他自定义的手的模型)处射出一道激光,被激光指到的物体放大并高亮,然后按trigger键确认选择。举个例子,按下菜单键后在用户现在的视野正前方产生一个设置窗口,手柄此时射出一道绿色激光,被激光射中的控件会放大并高亮,此时按trigger,效果就像是用鼠标点击了一下此处(适用于按钮、进度条、文本框等控件)。

2. 触碰选择。如果物体距离用户比较近,也可以使用触碰选择,当手柄接触到某个物体后,让这个物体高亮,等待用户按trigger键确认。

## VR应用的UI

VR中工具类的应用可以用到平面UI。

### 平面UI示例

下图是Steam Dashboard在VR中的效果:

可以看到如同非VR的应用一样,SteamVR的主要UI都放在一个panel中。不同之处在于,这个panel现在搁置在一个3D世界里,有透视效果;另外输入方式改成了用手柄上射出的激光去指。

之所以用平面UI,是因为这种方式早已经被人们所习惯,而且已经积累了很多经验。另外一个好处是它能在小面积内放下大量同类型的UI元素,比较适合做视频列表、游戏列表、主菜单之类的界面。

### 浸入式体验

在开始浸入式的体验之后(比如切入到一个纯3D的场景、游戏、或者全景视频),就不能把平面UI放在用户的视野正前方了。这时可以参考上面"用什么替代HUD"一节所讲到的立体UI。还有一个方法是当用户按下某个键时弹出一个平面菜单,这需要适当的引导————可以在应用开始时告诉用户怎么操作;也可以加上文字解释,让用户看向自己的手的时候,会发现手柄的按键旁边都有一行小字解释这个键的作用。

> 在Vive Cinema中,应用开始时是一个平面的视频列表,用户可以选择播放哪个视频、用什么方式播放(平面、360度还是180度?是否是立体视频?),选择完视频后,UI都会隐藏起来,开始浸入式播放。这个时候如果按菜单键,会在视野正前方生成一个平面的窗口,在上面可以调整进度,或者选择退出视频。

时间: 2024-10-08 23:36:58

HTC Vive开发笔记之UI Guideline的相关文章

HTC Vive开发笔记之手柄控制

怎么安装设备,配置环境我就不说了,自行百度,教程很多也很简单.接下来说下Vive手柄的控制. 手柄是HTC Vive的重要交互手段,我们通过第一个图片应该对其有一个直观的了解了,总共是九个按钮: 第一个是菜单按钮; 2,3,4,5分别对应的是Trackpad/Touchpad的上下左右,有时候对应的是XBox手柄的▲OX囗四个按钮或者摇杆; 6对应的是系统按钮/Steam; 7是Trigger/扳机,对应大多数FPS游戏里面的枪械的Shoot/Fire; 8对应的Grip/紧握在手柄的左右两侧各

HTC Vive开发笔记之SteamVR插件集成

重要组件 SteamVR_Camera VR摄像机,主要功能是将Unity摄像机的画面进行变化,形成Vive中的成像画面 使用方法: l 在任一个摄像机上增加脚本 l 点击Expand按钮 完成以上操作后,原本的摄像机会变成如下结构 l Origin:位置 l Head:头部 l Eye:眼睛 l Ears:耳朵 至此,游戏中Vive中可以看到游戏画面,360度旋转查看游戏世界,在游戏世界中移动等 SteamVR_ControllerManager和SteamVR_TrackedObject 控

HTC Vive开发笔记之手柄震动

手柄震动的代码SteamVR_Controller脚本的最上面的注释里面就有说明,其实也很简单 // Example usage: //这个栗子是左手柄震动 右手震动只需把Leftmost换成Rightmost即可 // var deviceIndex = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Leftmost); // if (deviceIndex != -1 && SteamVR_Con

IOS 开发笔记-基础 UI(5)使用代码创建按钮

在实际开发中,很多的时候是需要手动写代码来创建按钮的. 在开发过程中,并不是每次都通过storyboard拖控件完成UI界面,因为storyboard上面的界面是“固定死”的,有时候可能会在程序运行过程中动态地添加一些新的控件到界面上,比如QQ,微信的聊天信息,是有人发出一条信息后才动态显示出来的.因此,需要掌握如何用代码动态地添加控件.实际上,storyboard的本质就是根据图形界面描述转成相应的代码(xml 文件).还有一个原因,就是有的国内的公司,或者一些 IOS 开发的团队,并不使用故

IOS 开发笔记-基础 UI(3)按钮的使用(放大缩小、改变位置,首位式动画)和学习案例

UIKit框架提供了非常多的UI控件,但并不是每一个都很常用,有些控件可能1年内都用不上,有些控件天天用,比如UIButton.UILabel.UIImageView.UITableView等等,按钮控件是非常重要且比较基础的一个UI控件---UIButton,一般情况下,点击某个控件后,会做出相应反应的都是按钮,按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置. 案例: 功能分析 (1)左下角4个方向按钮,控制头像按钮的位置 (2)右下角分别是放大.缩小按钮,控制

IOS 开发笔记-基础 UI(1)-简单的计算器

(1)UI是App的根基:一个App应该是先有UI界面,然后在UI的基础上增加实用功能 (2)UI相对简单易学:UI普遍是学习过程中最简单的一块,能快速拥有成就感和学习兴趣 (3)UI至关重要:开发中的绝大部分时间都在处理UI 谨记一条IOS软件开发定律:万物皆对象,UI界面上的每一个元素都是一个对象 IOS,android 软件开发过程 UIKit框架是跟UI有关系的,标签,文本,按钮,进度条,开关等控件,都是封装在UIKit框架内部的,UIKit框架中提供了丰富多彩的可视化组件元素,利用UI

IOS 开发笔记-基础 UI(7)汤姆猫(UIImageView 的序列帧动画、图片加载,方法重构、Bundle 图片素材)

使用UIImageView.UIButton实现一个综合小案例---汤姆猫 回忆:UIImageView 来自UIView,UIView 来自UIResponder,UIButton 来自UIControl,UIControl 来自UIView 单独看实现,代码实现其实比较简单,但是创意很难得,美工要求很高! 是一个了不起的游戏! 功能分析 (1)点击对应的按钮后,让汤姆猫展现对应的动画 步骤分析 (1)搭建UI界面,同时也是准备素材 (2)监听按钮点击 (3)根据点击的按钮执行对应的动画 说明

IOS 开发笔记-基础 UI(2)

1.公司标示一般使用反向域名 正向域名 www.xxx.com 用来标示一台网络主机,只要公司内部不重复就可以.反向域名 com.xxx.demo 用来标示产品,应该唯一标识. cn.com.abc.product,最后面是自己公司的产品名字 2..Bundle Identifier: 产品唯一标示符 Bundle ID = 公司的反向域名 + 产品名 1> 在模拟器上面,只能有一个唯一的标示符的应用程序2> 在AppStore上,所有的应用程序的Bundler ID都是唯一的 Bundle

IOS 开发笔记-基础 UI(6)照片浏览器(控件的懒加载)

使用UIImageView.UILabel.UIButton实现一个综合小案例 功能分析 (1)点击箭头切换序号.图片.描述 (2)如果是首张图片,左边箭头不能点击 (3)如果是尾张图片,右边箭头不能点击 步骤分析 (1)搭建UI界面 (2)监听按钮点击 切换序号.图片.描述 1. 界面分析 1> 需要读取或修改的属性的控件 // 序号标签 // 图片 // 图片描述 // 左边按钮 // 右边按钮 2> 需要监听响应事件的对象,需要添加监听方法 // 左边按钮 // 右边按钮 uiimage