Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenghongzhi6/article/details/89948495

洪流学堂,让你快人几步。你好,我是郑洪智。

洪流学堂公众号回复捉妖,可以获取本教程的源码工程


大智:“小新,你小子最近是不是谈恋爱了,怎么天天往外跑?”

小新:“嘿嘿”

大智:“嘿嘿你个鬼啊,从实招来,是不是要请我吃饭了?”

小新:“最近有一款非常火的AR游戏,叫《一起来捉妖》,你玩了没?”

大智:“听说过,不过你看我最近忙的,哪有时间玩。什么样的游戏?”

小新:“和之前的Pokémon GO有点像,是用AR捉妖的游戏。”

大智:“明白了,以后这种游戏应该会越来越多。”

小新:“我好想学一下呀,这个游戏可以用Unity开发么?”

大智:“当然可以了,我问了腾讯游戏的童鞋,这款游戏也确实是用Unity开发的呢。”

小新:“那今天下午,你的时间就被我买断了,嘿嘿。”

大智:“好吧好吧,请我吃晚饭的权力也送给你了!”

小新:“忍了。。。”

利用陀螺仪实现AR相机

大智玩了一会《一起来捉妖》,对小新说:“这款游戏里面的AR实际上是利用陀螺仪实现的3自由度的AR,实现起来也比较简单,今天我们来一起搞一波。”

游戏截图.gif

小新:“陀螺仪我知道,3自由度是什么意思?”

大智:“自由度DOF,英文是degree of freedom,3自由度一般是指可以在三个轴进行旋转,但是不能识别平移。所以现在很多VR、AR的技术都在攻克6DOF的技术。不过3自由度的AR相机利用陀螺仪就可以实现。”

基本的实现思路是这样的:

  1. 使用陀螺仪来控制相机的旋转
  2. 背景使用后置摄像头的图像,跟随相机移动
  3. 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更简单。

猜你喜欢

转载自blog.csdn.net/zhenghongzhi6/article/details/89948495