如何用UNITY3D编写陀螺仪控制器

2024-03-12 14:40

本文主要是介绍如何用UNITY3D编写陀螺仪控制器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何用编写陀螺仪控制器

陀螺仪为开发者提供了各种各样令人兴奋的控制变化。但当涉及到相机控制器的集成和实现时,会发生很多奇怪和神奇的事情。开发人员必须处理不同的设备导向,初始相机位置,当然还有四元数。我很高兴分享我的经验,并描述我们如何在Heyworks中解决这些问题。希望这能帮助那些第一次使用陀螺仪的人减轻工作和辛苦。

在我的例子中,我想演示如何在摄像机控制器中实现以下功能:
  • 设备的屏幕被认为是进入虚拟世界的窗口,因此,围绕用户的设备必须重视它。
  • 它将支持自动旋转,并在每个设备方向上工作。
  • 你将能够从相机中分离控制器,通过代码改变它的旋转和位置(例如播放相机动画),然后附加控制器。
    它将使虚拟世界与真实世界的轴线平行,并将重新校准水平旋转。

我们解决的第一个问题是在iOS设备和中,使用不同坐标系统引用类型: left-handed and right-handed。为了将四元数从一个系统转换到另一个系统,让我们使用以下函数:
[AppleScript]  纯文本查看  复制代码
private static Quaternion ConvertRotation(Quaternion q){    return new Quaternion(q.x, q.y, -q.z, -q.w);}

现在我们可以用下面的代码来计算相机的旋转:
[AppleScript]  纯文本查看  复制代码
transform.rotation = ConvertRotation(Input.gyro.attitude);

另一个需要处理的问题是支持不同的方向(由Unity开发人员在内部解决),由以下修改后的代码为每个方向确定:
[AppleScript]  纯文本查看  复制代码
private Quaternion GetRotFix(){if (Screen.orientation == ScreenOrientation.Portrait)return Quaternion.identity;if (Screen.orientation == ScreenOrientation.LandscapeLeft|| Screen.orientation == ScreenOrientation.Landscape)return Quaternion.Euler(0, 0, -90);if (Screen.orientation == ScreenOrientation.LandscapeRight)return Quaternion.Euler(0, 0, 90);if (Screen.orientation == ScreenOrientation.PortraitUpsideDown)return Quaternion.Euler(0, 0, 180);return Quaternion.identity;
}

下面是新增的函数来计算相机的旋转:
[AppleScript]  纯文本查看  复制代码
transform.rotation = ConvertRotation(Input.gyro.attitude) * GetRotFix();

控制器应更新与基装置旋转相关的摄像机旋转,并在水平面上重置基相机旋转。这意味着,如果用户启动将设备指向北方的应用程序,游戏摄像机将不会旋转到虚拟的北方。摄像机将显示给定的方向。下面是考虑相机基旋转和设备基旋转的新功能。
[AppleScript]  纯文本查看  复制代码
transform.rotation = cameraBase * ( ConvertRotation(referenceRotation * Input.gyro.attitude) * GetRotFix();

对cameraBase和参数Rotation的计算有一点棘手。主要的两个障碍是:
  • 你必须考虑到当前的设备方向,同时计算参数Rotation
  • 你必须考虑在计算cameraBase时只围绕轴线旋转


在附件示例中可以找到确切的函数。
最后一件事,平滑相机旋转:
[AppleScript]  纯文本查看  复制代码
transform.rotation = Quaternion.Slerp(transform.rotation, cameraBase * ( ConvertRotation(referanceRotation * Input.gyro.attitude) * GetRotFix()), lowPassFilterFactor);

现在我们添加两个函数,AttachGyro和DetachGyro。第一个将启用控制器并重新计算所有的基旋转,第二个将禁用控制器。
最后我们的控制器准备好了。请在附件中找到工作示例。我将非常感谢您的评论和问题。希望,你会发现这个帖子有用!

这篇关于如何用UNITY3D编写陀螺仪控制器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/801592

相关文章

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

Wondows dos下怎么编写bat批处理文件

最近搞php,在运行时,以Nginx+php-cgi.exe方式运行Wordpress项目 打开dos,先cd到php-cgi.exe文件当前目录下执行启动命令:php-cgi.exe -b 127.0.0.1:9001再打开一个dos,再cd到nginx.exe文件当前目录下执行启动命令:start nginx 大概过程要经过这些步骤,觉得很麻烦,就学下怎么编写一个bat文件,以双击运行代替

用Python编写倒计时程序:详细教程

目录 引言 环境准备 基本概念 代码实现 步骤一:导入必要的库 步骤二:获取用户输入 步骤三:实现倒计时逻辑 步骤四:整合代码 运行程序 高级功能 扩展功能示例:支持分钟和小时输入 扩展功能示例:图形用户界面 (GUI) 总结 引言 倒计时程序是一个非常常见的小工具,广泛用于各种应用场景中,例如考试时间提醒、烹饪计时器、会议倒计时等。Python 作为一种

jmeter之仅一次控制器

仅一次控制器作用: 不管线程组设置多少次循环,它下面的组件都只会执行一次 Tips:很多情况下需要登录才能访问其他接口,比如:商品列表、添加商品到购物车、购物车列表等,在多场景下,登录只需要1次,我们期望的是重复执行登陆后面的接口来做压测,这就和事务相关,例如 事务1: 登录—>添加购物车 事务2: 登录—>购物车列表 事务3: 登录—>商品列表—>添加购物车 … 一、仅一次控制器案例 在