如何用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

相关文章

BD错误集锦8——在集成Spring MVC + MyBtis编写mapper文件时需要注意格式 You have an error in your SQL syntax

报错的文件 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yuan.dao.YuanUserDao"><!

如何利用echarts编写立体的柱状图表

1、引入 import * as echarts from 'echarts' 2、创建图标容器 3、调用渲染 <template><div ref="eachrtsBox" style="width: 200px;height: 200px;"></div></template><script>import * as echarts from 'echarts'export d

陀螺仪LSM6DSV16X与AI集成(8)----MotionFX库解析空间坐标

陀螺仪LSM6DSV16X与AI集成.8--MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启CRC串口设置开启X-CUBE-MEMS1设置加速度和角速度量程速率选择设置FIFO速率设置FIFO时间戳批处理速率配置过滤链初始化定义MotionFX文件卡尔曼滤波算法主程序执行流程lsm6dsv16x_motion_fx_determin欧拉角简介演示 概述 本文将探讨

ssh在本地虚拟机中的应用——解决虚拟机中编写和阅读代码不方便问题的一个小技巧

虚拟机中编程小技巧分享——ssh的使用 事情的起因是这样的:前几天一位工程师过来我这边,他看到我在主机和虚拟机运行了两个vscode环境,不经意间提了句:“这么艰苦的环境写代码啊”。 后来我一想:确实。 我长时间以来都是直接在虚拟机里写的代码,但是毕竟是虚拟机嘛,有时候编辑器没那么流畅,在文件比较多的时候跳转很麻烦,容易卡住。因此,我当晚简单思考了一下,想到了一个可行的解决方法——即用ssh

简单 使用 的makefile编写 框架

1、指定编译器,如海思平台:CROSS_COMPILE=arm-hisiv100nptl-linux-; 2、指定编译工具:GCC=$(CROSS_COMPILE)gcc   CC=$(CROSS_COMPILE)g++; 3、使用 export 导出 子makefile 要用的变量; 4、定义变量的形式  指定 工程源文件 需要使用到的 “宏”,在后面的 LDFLAGS 里面使用 -D将其

(转)Sublime Text 2 (Emmet):HTML/CSS代码快速编写神器

Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生。它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示:   Zen coding下的编码演示   去年年底,该插件已经改名为Emmet。但Emmet不只改名,还带来了一些新特性。本文就来直观地演示给你。 一、快速编写HTML代码 1.

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字,英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》,这本书主要讨论如何编写健壮、高质量的代码。作者在书中分享了许多实际编程的技巧和经验,旨在

Linux内核开发-编写一个内核模块

0.前言 上一章(点击返回上一章)已经完成了将ubuntu原始内核替换成了自己编好的内核。本章开始编写一个内核模块。 1.内核模块 1.1 什么是内核模块 Linux内核模块可独立于内核之外进行编译,可以在内核运行时动态加载、卸载。内核模块以.ko为后缀。 1.2 操作内核模块常用的指令 # 查看当前正在运行的模块lsmod#插入一个模块insmod module_name# 卸载

编写一个正则表达式:检查一个句子是否以大写字母开头,以句号结尾.

package 正则表达式;import java.util.regex.Pattern;public class Test2 {public static void main(String[] args) {String len="^[A-Z].*[\\.]$";String s1="A line terminator.";String s2="Wangdan1600";String s3="a

AJAX:如何编写一个关于AJAX的Hello World?(ajax发送异步请求(四步操作))

用到的一个Servlet类: package cn.edu.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;impor