洪流学堂,让你快人几步。你好,我是郑洪智。
洪流学堂公众号回复捉妖
,可以获取本教程的源码工程。
大智:“小新,你小子最近是不是谈恋爱了,怎么天天往外跑?”
小新:“嘿嘿”
大智:“嘿嘿你个鬼啊,从实招来,是不是要请我吃饭了?”
小新:“最近有一款非常火的AR游戏,叫《一起来捉妖》,你玩了没?”
大智:“听说过,不过你看我最近忙的,哪有时间玩。什么样的游戏?”
小新:“和之前的Pokémon GO有点像,是用AR捉妖的游戏。”
大智:“明白了,以后这种游戏应该会越来越多。”
小新:“我好想学一下呀,这个游戏可以用Unity开发么?”
大智:“当然可以了,我问了腾讯游戏的童鞋,这款游戏也确实是用Unity开发的呢。”
小新:“那今天下午,你的时间就被我买断了,嘿嘿。”
大智:“好吧好吧,请我吃晚饭的权力也送给你了!”
小新:“忍了。。。”
利用陀螺仪实现AR相机
大智玩了一会《一起来捉妖》,对小新说:“这款游戏里面的AR实际上是利用陀螺仪实现的3自由度的AR,实现起来也比较简单,今天我们来一起搞一波。”
小新:“陀螺仪我知道,3自由度是什么意思?”
大智:“自由度DOF,英文是degree of freedom,3自由度一般是指可以在三个轴进行旋转,但是不能识别平移。所以现在很多VR、AR的技术都在攻克6DOF的技术。不过3自由度的AR相机利用陀螺仪就可以实现。”
基本的实现思路是这样的:
- 使用陀螺仪来控制相机的旋转
- 背景使用后置摄像头的图像,跟随相机移动
- 3D模型保持世界坐标不动
1. 陀螺仪控制相机
陀螺仪控制相机涉及到以下几个知识点:
1、 如何在Unity中获取陀螺仪的数据
2、如何用陀螺仪的数据来控制相机旋转
在Unity中使用陀螺仪
在Unity中使用陀螺仪需要用到Input
类中的gyro
核心代码是:
// 从Input中获取陀螺仪对象
Gyroscope gyro = Input.gyro;
// 开启陀螺仪
gyro.enabled = true;
// 获取陀螺仪的态势数据,返回值是一个四元数
Debug.Log(gyro.attitude);
既然陀螺仪的态势数据是一个四元数,我们想当然可以使用这个四元数来直接和相机的旋转做运算,比如:
void Update()
{
transform.rotation = gyro.attitude;
}
由于我们在PC上开发,陀螺仪是没有数据的,需要我们发布到真机进行测试,或者使用Unity Remote(https://docs.unity3d.com/Manual/UnityRemote5.html)
由于Unity Remote在Android端只能从Google Play安装,需要翻,所以我传了一个安装包到百度云。
链接:https://pan.baidu.com/s/1VxNbRl6yF0F4URcHRM6b7A 提取码:vm62
优化在AR场景下的操作
小新:“我测试了一下,发现不太对啊,说不出来为什么。”
大智:“这是因为坐标系的问题。陀螺仪的数据使用的是右手坐标系,而Unity是左手坐标系,所以需要转换一下。”
// 将旋转从右手坐标系转换到左手坐标系
private static Quaternion ConvertRotation(Quaternion q)
{
return new Quaternion(q.x, q.y, -q.z, -q.w);
}
大智:“还有一个问题,就是通常情况下,使用AR时,手机是竖着的。但是由于陀螺仪的态势为0时,对应的是手机水平放置,所以如果想要手机是竖着时对应态势为0点,需要将相机沿着x轴旋转90度。”
可以使用如下代码:
transform.rotation = Quaternion.Euler(90, 0, 0) * ConvertRotation(gyro.attitude);
// 当然有些代码中会使用Quaternion.Euler(90, 0, 90),这并不会影响功能,只是影响左右旋转的初始位置
完整代码是:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GyroCameraController : MonoBehaviour
{
private Gyroscope gyro;
// 相机初始的态势
Quaternion cameraBase = Quaternion.Euler(90, 0, 0);
void Start()
{
// 从Input中获取陀螺仪对象
gyro = Input.gyro;
// 开启陀螺仪
gyro.enabled = true;
// 获取陀螺仪的态势数据
Debug.Log(gyro.attitude);
}
void Update()
{
transform.rotation = cameraBase * ConvertRotation(gyro.attitude);
}
// 将旋转从右手坐标系转换到左手坐标系
private static Quaternion ConvertRotation(Quaternion q)
{
return new Quaternion(q.x, q.y, -q.z, -q.w);
}
}
总结
大智:“今天学习了用Unity开发《一起来捉妖》的第一部分,那就是用陀螺仪实现一种伪AR的技术。当然了,这个AR技术还差一个非常重要的环节就是显示摄像头的功能,下次我们再一起攻克这个难题。”
洪流学堂公众号回复捉妖
,可以获取本教程的源码工程。
如果你想要视频教程,请点击文末右下角的在看让我知道哦,达到一定人数后就会专门为你录制!
今日思考题
大智:“动手将今天的工程部署到真机上体验一下。”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”
《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。