HTC VIVE开发教程(三)

在这一节,我介绍的主要内容有

  • [CameraRig]预制体
  • [SteamVR]预制体
  • [Status]预制体

在SteamVR插件的Prefabs文件夹下面有三个预制体,CameraRig是相机预制体,使用时直接将这个预制相机作为主相机拖入场景中,我们就能以第一人称看到VR头盔里面的内容。Status是通过overlay显示一些状态信息的预制体。SteamVR是渲染核心预制体,不需要手动添加,会自动创建。下面我就来详细讲解这三个预制体。

[Camerarig]

<div align="center">![这里写图片描述](https://img-blog.csdn.net/20160926164717530)</div>

我们可以看到,在Camerarig下面有一个左右手柄的Controller和一个头部的Camera

这里写图片描述 这里写图片描述

在手柄Controller和头部的Camera上都有一个Steam VR_Tracked Object脚本,这是用来跟踪设备位置的脚本。

void OnEnable()
    {
        var render = SteamVR_Render.instance;
        if (render == null)
        {
            enabled = false;
            return;
        }

        SteamVR_Utils.Event.Listen("new_poses", OnNewPoses); //监听new_poses通知
    }

我们在前面分析SteamVR渲染脚本SteamVR_Render时提到过在渲染循环里面有不断获取设备位置,并发送通知的逻辑,SteamVR_Utils.Event.Send(“new_poses”, poses),可以看到在Steam VR_Tracked脚本里面有注册这个监听,所以这个脚本可以不断的获取设备位置,同时更新在显示画面中的位置。我们在来看看OnNewPoses这个方法

private void OnNewPoses(params object[] args)
    {
        if (index == EIndex.None)   //设备的索引,头显默认为0
            return;

        var i = (int)index;

        isValid = false;
        var poses = (Valve.VR.TrackedDevicePose_t[])args[0];
        if (poses.Length <= i)
            return;

        if (!poses[i].bDeviceIsConnected)
            return;

        if (!poses[i].bPoseIsValid)
            return;

        isValid = true;

        var pose = new SteamVR_Utils.RigidTransform(poses[i].mDeviceToAbsoluteTracking);

        if (origin != null)
        {
            pose = new SteamVR_Utils.RigidTransform(origin) * pose;
            pose.pos.x *= origin.localScale.x;
            pose.pos.y *= origin.localScale.y;
            pose.pos.z *= origin.localScale.z;
            transform.position = pose.pos;
            transform.rotation = pose.rot;
        }
        else
        {
            transform.localPosition = pose.pos;
            transform.localRotation = pose.rot;
        }
    }

OnNewPoses的方法就是设置设备的transform,使得设备的实际空间中的位置与在头显画面中看到的位置一致。
Camera上面还有一些脚本,SteamVR_Camera.csSteamVR_CameraFlip.cs这两个脚本作用都是对相机渲染出来的图像进行一定的处理变换。SteamVR_GameView.cs是用来显示运行VR时pc上面的伴随窗口的。这里面的代码都不是太复杂,就不一一介绍了。

[SteamVR]

这里写图片描述

在SteamVR这个预制体只有Stean VR_Render这一个脚本,这个脚本在之前已经介绍了。这个预制体是必须在项目中添加的,即使不手动添加也会自动添加。
Pause Game When Dashboard Is Visible参数控制是否在显示控制面板时暂停游戏(在游戏过程中按系统键就会弹出控制面板),实际做法是将Unity的Time.timeScale设为0,相当于时间暂停了。
Lock Physical Update Rate To Render Frequency参数锁定物理更新频率为(头显)渲染帧率。这个会根据头显的渲染帧率来计算Unity的更新频率。
External Camera为外部相机,它的作用是制作那种将玩家的现实场景与虚拟的游戏场景融合的视频。
Tracking Space为跟踪空间的类型,可以设为坐姿和站姿,坐姿和站姿的区别是视角的高度。

[status]

这里写图片描述

status预制体的用处并不是很大,它的下面有6个组件,我来分别说一说这6个组件的作用

Calibration:这个组件用在Vive进行房间设置时进行相应的提示

这里写图片描述

_Stats:这个是显示统计信息的一个组件(目前仅显示帧率和丢帧数)。它上面还有一个Camera,通过它将GUIText渲染到overlay的纹理上,通过overlay将文字信息显示出来。它的显示效果如下图

这里写图片描述

TrackingLost:这个是失去头显定位后给的文字提示

TrackingRestored:这个是恢复头显定位后的提示信息

SteamInitFailure:这个是Steam初始化失败后的文字提示

Overlay:这个控件的作用是是一个2D的UI界面叠加到场景上面显示出来

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值