首页 > 其他分享 >Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机

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

时间:2023-04-28 16:33:45浏览次数:54  
标签:陀螺仪 gyro 大智 捉妖 Unity AR 小新


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

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


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

小新:“嘿嘿”

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

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

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

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

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

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

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

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

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

小新:“忍了。。。”

利用陀螺仪实现AR相机

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

小新:“陀螺仪我知道,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更简单。


标签:陀螺仪,gyro,大智,捉妖,Unity,AR,小新
From: https://blog.51cto.com/u_5746184/6234807

相关文章

  • [Unity脚本运行时更新]C#7.1新特性
    洪流学堂微信公众号。本文是该系列《Unity脚本运行时更新带来了什么?》的第6篇。洪流学堂公众号回复runtime,获取本系列所有文章。Unity2017-2018.2中的4.x运行时已经支持到C#6,之前的文章已经介绍完毕。Unity2018.3将支持到C#7.3,今天我们先来看看C#7.1新特性能给代码带来什么吧,不过......
  • [Unity脚本运行时更新]C#7.2新特性
    洪流学堂微信公众号。本文是该系列《Unity脚本运行时更新带来了什么?》的第7篇。洪流学堂公众号回复runtime,获取本系列所有文章。Unity2017-2018.2中的4.x运行时已经支持到C#6,之前的文章已经介绍完毕。Unity2018.3将支持到C#7.3,今天我们来看看C#7.2新特性能给代码带来什么吧,不过这......
  • Unity动画系统详解9:Target Matching是什么?
    摘要:在游戏中,经常有这种情况:角色的手或者脚需要在特定时间放在特定的位置。比如角色需要用手撑着跳过一个石头或一堵墙,或者跳起抓住房梁。TargetMatch就是让动画的特定片段去匹配特定的位置。洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动......
  • Unity2020.1新功能探路:Profiler相关更新
    洪流学堂,让你快人几步。你好,我是你的技术探路者郑洪智,你可以叫我大智。大智作为探路者带你一块探索一下Unity2020.1里面有什么好玩的东西。这一次Profiler的更新比较大,咱们专门用一篇来看看Profiler方面的更新。主要包含以下几个方面:Profiler作为单独程序启动ProfileAnalyer包的更......
  • Unity+SenseAR教程:用手势发射爱心【源码】
    摘要:Unity+SenseAR2.3开发的AR应用,基于手势识别功能,发射你的爱心~洪流学堂,让你快人几步。你好,我是你的技术探路者郑洪智,你可以叫我大智。今天开头就不絮叨了,一句“名言”送给大家,然后咱们把代码微微的一写。“虽然今天是情人节,但怎会比学习带来更多的多巴胺呢?”——澹深苟最终效果......
  • [独家放送]Unity2020规划预览,可视化编程又双叒叕来了!
    你好,我是你的技术探路者郑洪智,你可以叫我大智。欢迎一起进入2020年,在新的一年里Unity有什么大动作呢?本文带你速览你最关心的Unity2020的核心功能!你最可能关心的功能有哪些呢?Unity2019.3在哪里???(乱入)下面从四个方面来看Unity有哪些更新:核心功能和性能更多的DOTS(Data-OrientedTechSt......
  • Unity获取Material的属性名小坑
    最近在学习UntiyShader的使用,在获取UnityMaterial的属性名时遇到了一个小坑。如图我现在实现了一个云的效果的ShaderShader的属性名如下图红框所示: 当我们想用代码尝试获取属性名并修改时,问题出现了: 报错: 解决:查看shadergraph发现了问题,属性名原来与Shader中的......
  • Unity跟IOS原生开发项目融合
    更多精品文章Aladdin的博客需求:做一款社交类的APP,主体工程是原生开发,也就是是IOS的Xcode工程,产品经理为了丰富应用的玩法,就想往里面加上现在比较流行的AR功能,组成一款AR社交APP,我们之前见识多的都是工程是主体,然后IOS原生功能或者代码作为插件添加进Unity的Plugin里面,这样的方式参......
  • Unity Profiler使用说明
    CPUUsageProfilermoduleCPU使用分析器模块的图表显示了在应用程序中花费的时间。它包含应用程序花费时间的所有重要领域的概述,比如渲染,它的脚本和动画[toc]。本文包括:-CPU使用图表-CPU使用模块详细信息窗格-Timeline视图-层次结构和原始层次结构视图-常见的样品-......
  • [Unity]AssetBundle资源更新以及多线程下载
    前言此文章适合不太了解资源加载的萌新,有了入门基础之后再去github上搜大牛写的专业的资源加载方案才能得心应手,不然的话会看的很吃力或者说一脸懵逼。Unity里面关于资源加载我们都知道是下载更新AssetBundle,关于AssetBundle我之前的文章已经详细介绍过,没看过的朋友可以在看一下。......