需要指南针陀螺仪帮助

2024-03-08

我需要一个游戏对象指向北方,并且我想将其与 gyro.attitude 输入结合起来。我曾尝试一步完成此任务,但没有成功。也就是说,我无法制作任何我在网上找到的陀螺仪脚本,以满足始终指向北方的额外要求。相信我,我已经尝试了所有能找到的关于这个主题的脚本。我推断这是不可能的,而且认为这是可以做到的可能是愚蠢的;至少不是这样(即一体化)。我想你可能会说我推测你不能同时做两件事。然后我想通过分解职责也许可以达到同样的效果。也就是说,游戏对象始终通过 Y 轴指向北。太好了,像这样完成了:

_parentDummyRotationObject.transform.rotation = Quaternion.Slerp(_parentDummyRotationObject.transform.rotation, Quaternion.Euler(0, 360 - Input.compass.trueHeading, 0), Time.deltaTime * 5f);

当游戏对象在 Y 轴上指向北时,我想添加第二个游戏对象(本例中为摄像机),并使用 X 轴和 Z 轴上的陀螺仪输入进行旋转。我必须消除相机上的 Y 轴的原因是因为我得到了双旋转。当两个物体同时旋转(即摄像机和游戏对象)时,180 度旋转会在场景中产生 360 度旋转。请记住,我需要游戏对象始终根据设备指南针指向北方(IRL)。如果我的设备指向东方,那么我的游戏对象将在统一场景中旋转 90 度,因为它指向(旋转)北方。

我读过很多关于陀螺仪相机控制器的内容,我看到经常提到的一件事是,你不应该尝试在 1 或 2 轴上执行此操作(限制它),当使用四元数时,当你不知道你要做什么时,这是不可能的我正在做,而我显然没有这样做。

我已经尝试了这个已解决问题的所有 3 个解决方案:Unity - 陀螺仪 - 仅绕一个轴旋转 https://stackoverflow.com/questions/41927052/unity-gyroscope-rotation-around-one-axis-only并且每个都未能使我的相机在一个轴上旋转以满足我的旋转需求。我想我应该先让第一个轴工作,然后再用第二个轴搅浑水。顺便说一句,我的要求很简单,相机只能基于我设备的 X 轴在 1 个轴(任何方向)上旋转。如果我能解出 X,那么我认为获得 Z 陀螺仪输入来控制相机也很棒。到目前为止,我无法仅在 1 个轴 (X) 上控制相机。无论如何,这是我的发现......

第一个解决方案使用了Input.gyro.rotationRateUnbiased,完全不准确。也就是说,如果我将设备旋转几次,然后将手机/设备放在桌子上,则相机每次都会处于不同的旋转/位置。没有一致性。这是我第一次尝试/解决方案的代码:

<code>
private void Update()
{
  Vector3 previousEulerAngles = transform.eulerAngles;
  Vector3 gyroInput = Input.gyro.rotationRateUnbiased;
  Vector3 targetEulerAngles = previousEulerAngles + gyroInput * Time.deltaTime * Mathf.Rad2Deg;
  targetEulerAngles.y = 0.0f; 
  targetEulerAngles.z = 0.0f;
  transform.eulerAngles = targetEulerAngles;
}
</code>

第二个解决方案非常一致,因为我可以旋转我的设备,然后将其放在桌子上,并且统一相机总是最终处于相同的位置/旋转/状态。我遇到的问题是相机会在一个轴(本例中为 X)上旋转,但当我在 y 或 x 轴上旋转设备时,它就会这样做。我的手机的任何类型的旋转/移动都会导致统一相机在 X 轴上移动。我不明白为什么我的手机的 y 旋转会导致相机在 X 轴上旋转。这是我的解决方案 #2 的代码:

    private void Start()
{
  Input.gyro.enabled = true;
  startEulerAngles = transform.eulerAngles;
  startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}
private void Update()
{
  Vector3 deltaEulerAngles = Input.gyro.attitude.eulerAngles - startGyroAttitudeToEuler;
  deltaEulerAngles.y = 0.0f;
  deltaEulerAngles.z = 0.0f;
  transform.eulerAngles = startEulerAngles - deltaEulerAngles;
}

第三个解决方案:我不确定如何完成最后一个解决方案,因此它从未真正起作用。当2轴归零时,相机只是从左向右翻转,或者从上翻转到下翻转;取决于哪个轴被注释掉。如果没有任何轴被注释掉(就像原始解决方案一样),相机将在所有轴上旋转。这是我的尝试 #3 的代码:

    private void Start()
{
  _upVec = Vector3.zero;
  Input.gyro.enabled = true;
  startEulerAngles = transform.eulerAngles;
}
private void Update()
{
  Vector3 gyroEuler = Input.gyro.attitude.eulerAngles;
  phoneDummy.transform.eulerAngles = new Vector3(-1.0f * gyroEuler.x, -1.0f * gyroEuler.y, gyroEuler.z);
  _upVec = phoneDummy.transform.InverseTransformDirection(-1f * Vector3.forward);
  _upVec.z = 0;
//    _upVec.x = 0;
  _upVec.y = 0;
  transform.LookAt(_upVec);
//    transform.eulerAngles = _upVec;
}

本来我以为这是我的技术,但是花了一个月的时间我开始觉得这是不可能的。但那是不可能的。我知道这需要吸收很多东西,但这是一个非常简单的概念。

有任何想法吗?

编辑:我想添加我的层次结构:

CameraRotator(带有脚本的父级)-> MainCamera(子级)

CompassRotator(父级)-> Compass(具有旋转父级脚本的子级)


我会按以下方式执行此操作: 默认 0, 0, 0 旋转的相机截屏 https://i.stack.imgur.com/0Pd8f.png

物体放置在相机默认位置的中心。

相机脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    Camera m_MainCamera;
    // Start is called before the first frame update
    void Start()
    {
        // Disable the sleep timeout during gameplay. 
        // You can re-enable the timeout when menu screens are displayed as necessary. 
        Screen.sleepTimeout = SleepTimeout.NeverSleep;
        // Enable the gyroscope. 
        if (SystemInfo.supportsGyroscope)
        {
            Input.gyro.enabled = true;
        }
        m_MainCamera = Camera.main;
        m_MainCamera.enabled = true;
    }

    // Update is called once per frame
    void Update()
    {
        if (m_MainCamera.enabled)
        {
            // First - Grab the Gyro's orientation. 
            Quaternion tAttitude = Input.gyro.attitude;
            // The Device uses a 'left-hand' orientation, we need to transform it to 'right-hand'
            Quaternion tGyro = new Quaternion(tAttitude.x, tAttitude.y, -tAttitude.z, -tAttitude.w);

            // the gyro attitude is tilted towards the floor and upside-down reletive to what we want in unity.  
            // First Rotate the orientation up 90deg on the X Axis, then 180Deg on the Z to flip it right-side up. 
            Quaternion tRotation = Quaternion.Euler(-90f, 0, 0) * tGyro;
            tRotation = Quaternion.Euler(0, 0, 180f) * tRotation;

            // You can now apply this rotation to any unity camera!
            m_MainCamera.transform.localRotation = tRotation;
        }
    }
}

使用此脚本,无论如何我的对象始终面向南。

如果您希望对象面向北,您只需将视图在 Y 轴上旋转 180° 作为最后一次旋转:

Quaternion tRotation = Quaternion.Euler(-90f, 0, 0) * tGyro;
tRotation = Quaternion.Euler(0, 0, 180f) * tRotation;
//Face NORTH:
tRotation = Quaternion.Euler(0,180f, 0) * tRotation;

希望这会有所帮助;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要指南针陀螺仪帮助 的相关文章

  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request

随机推荐

  • 当出现客户端未知错误时如何在 Perforce P4 中设置客户端根

    突然 当我跑步时p4 info在终端中 我注意到客户端根目录未设置 不知道为什么它突然被取消设置 以下是输出 其中显示 客户端未知 代替客户端根目录 我可以通过什么命令设置一样吗 我试过了p4 client and p4 set但可能是 语
  • 使用 Google Analytics for Android SDK 时遇到的问题 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 使用适用于 Android 的 Go
  • Python Flask 在执行函数的同时返回 html 页面

    我目前正在使用 Python Flask 创建一个 Web 应用程序 但我遇到了障碍 我不确定我是否正确地思考了它 因此 我网站的主页只是一个简单的登陆页面 其中包含执行网站功能所需的文本输入 我想要完成的是让网络应用程序在输入文本后执行两
  • 如何从部分视图将 JavaScript 渲染到 MasterLayout 部分?

    给定 MVC3 和 Razor 引擎 我得到 MasterLayout cshtml RenderSection JavaScript required false RenderBody 查看 cshtml MasterLayout csh
  • 为变量名称添加前缀以指示它们各自的范围或来源?

    在我工作过的公司中 我见过很多使用前缀来指示变量的范围或来源的情况 例如m对于班级成员来说 i对于方法内部变量和a or p 对于方法参数 public class User private String mUserName public
  • Android 媒体播放器错误 (-19, 0)

    我尝试在单击按钮时重播声音 但我得到错误 19 0 这意味着什么 My code final Button xxx Button findViewById R id xxx xxx setOnClickListener new View O
  • Azure 网站和 Sass

    我一直在尝试寻找是否有一种方法可以通过 windows azure 网站支持 sass 有人可以向我指出一些文档吗 或者如果可能的话现在就让我知道 我特别希望支持祖布基金会 http foundation zurb com index ht
  • Pandas:如果预定义列表中不存在,则将列值替换为空

    我有一个清单 X 其中包含列的一组合法值 说吧 我有专栏A 我想替换 设置 为空字符串 中的元素df A 如果它们的值不在 X 中 我怎样才能在 Pandas 中有效地做到这一点 我知道有isin 但这只是检查值是否存在并返回一系列 Tru
  • 通过Windows中的命令行工具合并两个png?

    我正在寻找一个可以通过命令行 Windows 7 使用的工具来合并两个相同大小的 png 到目前为止 我在搜索方面运气不佳 因为我见过的大多数工具都是相当笨重的应用程序 它们似乎不针对简单的操作 我想用覆盖图像中的非透明像素覆盖不透明基本图
  • 情节 orca 无法在 aws ec2 实例上工作

    我跟着this https github com plotly orca安装conda plotly orca在 AWS EC2 实例上 构建于anaconda python3图像 但击中Cannot open shared object调
  • WIX如何从自定义操作访问源文件

    我有一个 WIX 安装应用程序和许多源文件
  • 如何防止行高在顶部添加边距?

    每当我使用大line height like 1 6em它总是在文本的最顶部添加我不想要的边距 例子 http jsfiddle net EstpJ 1 http jsfiddle net EstpJ 1 我希望文本的边框清晰 并且没有任何
  • 分布式erlang安全如何?

    我想要有 2 个独立的 erlang 节点可以相互通信 so node a myhost将能够发送消息至b myhost 有没有办法限制节点a myhost 所以只有来自 a 的函数安全模块可以被召唤b myhost 它应该是这样的 a m
  • twitter bootstrap - 背景颜色

    我正在尝试更改引导程序的背景颜色和不透明度 我有以下 CSS well opacity 0 9 opacity 0 1 moz opacity 0 9 opacity 0 1 webkit opacity 0 9 opacity 0 1 b
  • CodeIgniter 中视图中的 $this 关键字

    我试图理解如何 this gt load gt view works insideCodeIgniter 中的视图文件的一部分 core Controller php 正在调用 core Loader php 然后调用 ci load 后者
  • 读取thunderbird地址mab文件内容

    我的 TBIRD 地址簿上有几个地址列表 每次我需要编辑包含在多个列表中的地址时 查找哪个列表包含要修改的地址都是一件很痛苦的事情 作为一个帮助工具 我想阅读几个文件 并只给用户一个列表 xxx MAB 文件仅包含一次搜索的搜索地址 有了生
  • 在 R 中将字符串拆分为新行[重复]

    这个问题在这里已经有答案了 我有一个如下数据集 Country Region Molecule Item Code IND NA PB102 FR206985511 THAI AP PB103 BA 107603 F000113361 10
  • PHPUnit、接口和命名空间 (Symfony2)

    我目前正在为 Symfony2 开发一个开源包 并且真的希望它在单元测试覆盖率和一般可靠性方面成为最优秀的 但是由于我缺乏 PHPUnit 知识 或复杂的场景 谁知道 目前 我有一个 Mailer 类 用于处理个人邮件场景 它看起来有点像这
  • 找不到 docker 命令

    我在Mac上安装了docker 安装成功 它还正在运行 并尝试在终端中执行以下命令 docker v 请参阅以下错误 bash docker command not found 我该如何解决这个问题 在 Windows 中这些命令运行良好
  • 需要指南针陀螺仪帮助

    我需要一个游戏对象指向北方 并且我想将其与 gyro attitude 输入结合起来 我曾尝试一步完成此任务 但没有成功 也就是说 我无法制作任何我在网上找到的陀螺仪脚本 以满足始终指向北方的额外要求 相信我 我已经尝试了所有能找到的关于这