Unity中的四元数和旋转

2024-03-25 03:38
文章标签 旋转 unity 四元

本文主要是介绍Unity中的四元数和旋转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 四元数
      • Unity中使用四元数表示旋转
      • 案例
          • 描述
          • 代码

四元数

四元数用来表示一个物体的位置,或者旋转。这两种其实是等价的。我们可以说一个三维向量 ( x , y , z ) (x,y,z) (x,y,z)可以表示一个物体的空间位置,也可以表示位移。因为任何一个三维向量可以表示原物体相对于位置 ( 0 , 0 , 0 ) (0,0,0) (0,0,0)的位移。同样,一个四元数表示的物体位置也可以看作是一个物体相对于初始四元数 ( 0 , 0 , 0 , 0 ) (0,0,0,0) (0,0,0,0)的旋转。

Unity中使用四元数表示旋转

在Unity中,记录一个物体相对于初始位置的旋转的变量就是 transform.rotation。注意这个是在世界坐标下的旋转。在父结点坐标下的旋转用transform.localRotation。现在物体要做一个旋转动作R,假设这个旋转动作R表示的四元数为q,则旋转一个物体的代码如下:

transform.rotation = q * transform.rotation;

注意这里旋转动作要左乘。因为四元数的乘法不满足交换律。这行代码当然可以看作是物体在世界坐标系下,从初始状态开始,先旋转transform.rotation,再做 q 旋转。
现在问题就是如何求解旋转动作 q
为了求解旋转动作q,我们需要知道两个信息。一个旋转可以用一个旋转轴和旋转角度表示,所以这两个信息就是表示旋转轴的向量 rotationAxis = (x, y, z)和旋转角度 angle = θ。然后Unity提供了一个函数用来得到这个旋转动作的四元数:

Quaternion q = Quaternion.AngleAxis(angle, rotationAxis);

案例

描述

一个球体sphere,一个照向球体的相机mainCamera,球体上一只蚂蚁 ant。现在相机没有正对着ant,我们要求旋转球体,让相机正对着ant。

代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;// 将此脚本挂载在球体上
public class LookAtTheAnt : MonoBehaviour
{public Transform mainCamera;public Transform ant;private void Start(){LookAtAnt();}private void LookAtAnt(){// 因为球体旋转点在球心,所以此旋转动作的旋转轴一定经过球心// 计算球心到蚂蚁的向量,表示蚂蚁的位置Vector3 v1 = ant.position - transform.position;// 计算球心到相机的向量,表示相机的位置Vector3 v2 = mainCamera.position - transform.position;// 计算旋转轴,旋转轴经过球心,与v1,v2构成的平面的法线平行,法线用该平面的任意两个向量的叉乘得到Vector3 normal = Vector3.Cross(v1, v2);// 计算从蚂蚁旋转到相机的角度float angle = Vector3.Angle(v1, v2);// 计算该旋转动作表示的四元数Quaternion q = Quaternion.AngleAxis(angle, normal);// 旋转球体transform.rotation = q * transform.rotation;
}

今天做项目的时候突然需要蛋疼地研究四元数,看了半天就这点成果,欢迎大佬批评指正,或者补充。

这篇关于Unity中的四元数和旋转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您