csgo陀螺仪是什么意思_Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机

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

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


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

小新:“嘿嘿”

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

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

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

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

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

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

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

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

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

小新:“忍了。。。”

利用陀螺仪实现AR相机

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

4561fc32ec030c84339aa0e17654c60e.png

272a18a3758b5b54fe06d9fbe079477f.gif
游戏截图.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端只能从guge商店安装,需要tizi,所以我传了一个安装包到百度云。
链接: https:// pan.baidu.com/s/1VxNbRl 6yF0F4URcHRM6b7A
提取码: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技术还差一个非常重要的环节就是显示摄像头的功能,下次我们再一起攻克这个难题。”

c7a456ec344286bf1f40e6d48379c602.png
https://www.zhihu.com/video/1109425802160095232

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

今日思考题

大智:“动手将今天的工程部署到真机上体验一下。”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”

推荐阅读

  • Unity 2019.1 中文更新日志速览版
  • UnityWebRequest详解
  • Unity中编码Encoding脱坑指南
  • Unity中的Git最佳实践
  • Unity2019更新规划速览,将有官方的可视化编程!
  • Unity运行时更新带来了什么?
  • Unity2018.3新功能 | Prefab嵌套和变体
  • Unity3d中的百度语音识别及语音合成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
headers = { "User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.5", } #buff_cookie=Device-Id=XLjfIKmqYdZOl13kurAk; Locale-Supported=zh-Hans; game=csgo; NTES_YD_SESS=uRfvo1tg47qUhPC.zZn1eYfeulPZJ2LrgyFtvmT21FmVZ2qhZLps8NoRt2I6u42nBEfAl0DC2kr3Q0MJx1R_cgLha79FUaGziH_Ab0547Pp.m82.XHkIJ.cB9YRyjBJhrGvBgP8AcQAJKvnEU3mUbjNiZ_PWF5vhvnUMr1J95ljN8yzPU5DYCD7xRj4i3j3Z.LgtnCnAf44KDtYtOTI1CLIWZvkZ.tg_U_TZve0Q.WMMi; S_INFO=1686062063|0|0&60##|17860971786; P_INFO=17860971786|1686062063|1|netease_buff|00&99|null&null&null#not_found&null#10#0|&0||17860971786; remember_me=U1097288259|fSimYVO9MRMclOPjMhKxdzwo4KQ8Inz5; session=1-kTFVdNzCYMqOg0xjyicwy9GNHvKIN0dMQpwIFW2fVCbE2041173275; csrf_token=ImVmYzdiN2I0NTg5MGQyY2VlZDQwMGQxNzIxOTI1ZGIzNGE1MzI0Nzgi.F2DVgA.bHasgO17bW8V-MVkHAfrdjJDMuU buff_cookie="Device-Id=XLjfIKmqYdZOl13kurAk; Locale-Supported=zh-Hans; game=csgo; NTES_YD_SESS=uRfvo1tg47qUhPC.zZn1eYfeulPZJ2LrgyFtvmT21FmVZ2qhZLps8NoRt2I6u42nBEfAl0DC2kr3Q0MJx1R_cgLha79FUaGziH_Ab0547Pp.m82.XHkIJ.cB9YRyjBJhrGvBgP8AcQAJKvnEU3mUbjNiZ_PWF5vhvnUMr1J95ljN8yzPU5DYCD7xRj4i3j3Z.LgtnCnAf44KDtYtOTI1CLIWZvkZ.tg_U_TZve0Q.WMMi; S_INFO=1686062063|0|0&60##|17860971786; P_INFO=17860971786|1686062063|1|netease_buff|00&99|null&null&null#not_found&null#10#0|&0||17860971786; remember_me=U1097288259|fSimYVO9MRMclOPjMhKxdzwo4KQ8Inz5; session=1-kTFVdNzCYMqOg0xjyicwy9GNHvKIN0dMQpwIFW2fVCbE2041173275; csrf_token=ImVmYzdiN2I0NTg5MGQyY2VlZDQwMGQxNzIxOTI1ZGIzNGE1MzI0Nzgi.F2DVgA.bHasgO17bW8V-MVkHAfrdjJDMuU" headers['Cookie'] = buff_cookie base_url="https://buff.163.com/api/market/goods/sell_order?game=csgo&goods_id=%goods_id%&page_num=1" goods_id=35245 base_url= base_url.replace('%goods_id%',str(goods_id)) print(base_url)
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值