unity学习17:unity里的旋转学习,欧拉角,四元数等

目录

1 三维空间里的旋转与欧拉角,四元数

1.1 欧拉角比较符合直观

1.2 四元数

1.3 下面是欧拉角和四元数的一些参考文章

2 关于旋转的这些知识点

2.1 使用euler欧拉角旋转

2.2 使用quaternion四元数,w,x,y,z

2.3 使用quaternion四元数,类 Vector3.zero 这种固定坐标了,固定的旋转?

2.4 利用unity编辑器,在unity里通过看向一个物体而实现旋转

2.5 互转

2.5.1 使用Euler转化为quaternion四元数

2.5.2 使用quaternion四元数转化为Euler角

3 逐一测试旋转效果

3.1 直接使用Euler角Vector3(0,30,0)来旋转

3.2   直接使用quaternion四元数旋转

3.3 将quaternion四元数转化为Euler角后旋转

3.4 用欧拉角转成四元数后旋转

3.5 直接用Quaternion.AngleAxis *Quaternion.AngleAxis 实现同时绕着多轴旋转

3.6 直接用Quaternion.AngleAxis *Quaternion.AngleAxis 实现同时绕着多轴旋转

3.7 下面是完整的测试草稿代码

4 未解决的问题

4.1 不了解为啥上面有的时候可以持续旋转,有时候只能旋转1次

4.2 关于下面的匀速代码

5 另外一种匀速代码


1 三维空间里的旋转与欧拉角,四元数

  • 欧拉角,四元数,都是用来表达三维空间里的旋转的

1.1 欧拉角比较符合直观

欧拉角与四元数-CSDN博客文章浏览阅读1.6w次,点赞29次,收藏127次。一、欧拉角静态的定义对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。如图所示。设定xyz-轴为参考系的参考轴。称xy-平面与XY-平面的相交为交点线,用英文字母(N)代表。zxz顺规的欧拉角可以静态地这样定义:α\alphaα 是 x-轴与交点线的夹角,β\betaβ 是z-..._欧拉角和四元数的区别https://blog.csdn.net/ViatorSun/article/details/102713679

unity里的E,旋转,很明显表示方式就是欧拉角的3种旋转轴

1.2 四元数

  • 我们用复数(两个数字)可以表示二维上的旋转,那么是不是用三个数字(三元数)可以表示三维空间中的旋转呢?数学家告诉我们不是的,要表示三维空间中的旋转,我们得用四元数。
  • unity 里不只支持欧拉角,也支持用 四元数,表达三维空间里的旋转
  • 四元数的基本数学方程为 : q = cos (a/2) + i(x * sin(a/2)) + j(y * sin(a/2)) + k(z * sin(a/2)) 其中a表示旋转角度,(x,y,z)表示旋转轴。

  • 四元数的定义:q = [w,x,y,z]其中w是实部,当然也有资料会把四元数写成q = [x,y,z,w]其中w是实部。这都是正确的

  • 注意:四元数q,有q^2 = 1.

若想要某个物体(i,j,k)绕着a(x,y,z)轴旋转θ度。

这个旋转用四元数表示就是q = ((x,y,z)sinθ/2, cosθ/2)

该物体用四元数表示为p = ((j,j,k),0)。

那么旋转之后的物体的点为p′,

则:

通过某个公式能算出p′的值。

Quaternion.AngleAxis (30.0f, transform.right) 这个方法的意思是创建一个四元数表示饶transform.right轴旋转30度。

四元数可以用*操作符来进行多个旋转操作比如:

transform.rotation =

Quaternion.AngleAxis (30.0f, transform.right) * Quaternion.AngleAxis (30.0f,transform.up);

也可以用 Quaternion.Euler 欧拉旋转表示四元数旋转比如:

transform.rotation = Quaternion.Euler (new Vector3 (0.0f, 30.0f, 20.0f)) * Quaternion.AngleAxis (30.0f, transform.forward);

如果想对一个向量做旋转做法如下:

Vector3 someVector = new Vector3 (1.0f,1.0f,1.0f);
Vector3 newVector = Quaternion.AngleAxis(90, Vector3.up) * someVector;

Quaternion.LookRotation(某个向量v) 使得物体的朝向和v一致

利用四元数做差值(Quaternion.Slerp)旋转:

transform.rotation = Quaternion.Slerp (transform.rotation,Quaternion.Euler (new Vector3 (0.0f, 30.0f, 0.0f)) * Quaternion.AngleAxis (30.0f, transform.forward),Time.deltaTime * 0.33f);

1.3 下面是欧拉角和四元数的一些参考文章

https://zhuanlan.zhihu.com/p/267359507icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/267359507

https://zhuanlan.zhihu.com/p/513687673icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/513687673

https://www.zhihu.com/question/23005815icon-default.png?t=O83Ahttps://www.zhihu.com/question/23005815

https://zhuanlan.zhihu.com/p/27471300icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/27471300

2 关于旋转的这些知识点

2.1 使用euler欧拉角旋转

  • Vector3 rotate1 = new Vector3(0,30,0);
  • 在unity里表示,绕着Y轴旋转30度

2.2 使用quaternion四元数,w,x,y,z

  • 其中W是实数部分
  • xyz是虚数部分
  • Quaternion quaternion1 = new Quaternion(0,0,0,0);

Quaternion.AngleAxis (30.0f, transform.right)

2.3 使用quaternion四元数,类 Vector3.zero 这种固定坐标了,固定的旋转?

  • Quaternion quaternion2 = Quaternion.identity;

2.4 利用unity编辑器,在unity里通过看向一个物体而实现旋转

  • quaternion2 = Quaternion.LookRotation(new Vector3(0,0,0));


 

2.5 互转

2.5.1 使用Euler转化为quaternion四元数

  • quaternion2 = Quaternion.Euler(rotate1);

2.5.2 使用quaternion四元数转化为Euler角

  • rotate2 = quaternion2.eulerAngles;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//使用euler欧拉角旋转Vector3 rotate1 = new Vector3(0,30,0);//使用quaternion四元数,xyzw?Quaternion quaternion1 = new Quaternion(0,0,0,0);//使用quaternion四元数,类 Vector3.zero 这种固定坐标了,固定的旋转?Quaternion quaternion2 = Quaternion.identity;//利用unity编辑器,在unity里通过看向一个物体而实现旋转//重新给quaternion2赋值quaternion2 = Quaternion.LookRotation(new Vector3(0,0,0));///互转//使用Euler转化为quaternion四元数quaternion2 = Quaternion.Euler(rotate1);//使用quaternion四元数转化为Euler角//给rotate2赋值,需要先定义rotate2Vector3 rotate2 = new Vector3(0,0,0);rotate2 = quaternion2.eulerAngles;}// Update is called once per framevoid Update(){}
}

3 逐一测试旋转效果

3.1 直接使用Euler角Vector3(0,30,0)来旋转

    Vector3 rotate1 = new Vector3(0,30,0);

    this.transform.Rotate(rotate1);  

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//使用euler欧拉角旋转Vector3 rotate1 = new Vector3(0,30,0);this.transform.Rotate(rotate1);     }
}

3.2   直接使用quaternion四元数旋转

  • w,xyz ,其中w是实数部分,xyz都是*i的虚数部分
  • 比如
  • new Quaternion(0.866f,0,0,0.5f);
  • new Quaternion(0,0,0,0);
  • Quaternion.identity;

  •     //quaternion1不能持续旋转这个方法?this.transform.Rotate(quaternion1);
  •     //只能用this.transform.rotation 旋转到指定位置,而不能持续旋转
  •     this.transform.rotation = quaternion1;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//使用euler欧拉角旋转//Vector3 rotate1 = new Vector3(0,30,0);//使用quaternion四元数,w,xyz ,其中w是实数部分,xyz都是*i的虚数部分Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f); //quaternion1不能持续旋转这个方法?this.transform.Rotate(quaternion1); //只能用this.transform.rotation 旋转到指定位置,而不能持续旋转this.transform.rotation = quaternion1;}
}

3.3 将quaternion四元数转化为Euler角后旋转

  • quaternion1.eulerAngles 可以将quaternion四元数转化为Euler角
  • rotate2 = quaternion1.eulerAngles;

    Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f);

    Vector3 rotate2 = new Vector3(0,0,0);

    rotate2 = quaternion1.eulerAngles;

    this.transform.Rotate(rotate2);  

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f); Vector3 rotate2 = new Vector3(0,0,0);rotate2 = quaternion1.eulerAngles;this.transform.Rotate(rotate2);  }
}

3.4 用欧拉角转成四元数后旋转

    // 创建一个表示xx度旋转欧拉角,然后转换为的四元数,表示绕Y轴旋转

    Quaternion rotate3 = Quaternion.Euler(0, 45, 0);

    // 假设你有一个现有的四元数

    Quaternion originalQuaternion = Quaternion.identity;

    // 转换为30度旋转

    Quaternion newQuaternion = rotate3 * originalQuaternion;

    // 应用到游戏对象

    this.transform.rotation = newQuaternion;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// 创建一个表示xx度旋转欧拉角,然后转换为的四元数,表示绕Y轴旋转Quaternion rotate3 = Quaternion.Euler(0, 45, 0);// 假设你有一个现有的四元数Quaternion originalQuaternion = Quaternion.identity;// 转换为30度旋转Quaternion newQuaternion = rotate3 * originalQuaternion;// 应用到游戏对象this.transform.rotation = newQuaternion;}
}

3.5 直接用Quaternion.AngleAxis *Quaternion.AngleAxis 实现同时绕着多轴旋转

  •     this.transform.rotation = Quaternion.AngleAxis (90.0f, transform.right)  *  Quaternion.AngleAxis (30.0f, transform.up);
  • Quaternion.AngleAxis (90.0f, transform.right)    // 绕着right轴X轴旋转90
  • Quaternion.AngleAxis (30.0f, transform.up)       // 绕着up轴y轴旋转30
  • this.transform.rotation 可以实现连续旋转,不知道为啥上面的只能转1次

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){this.transform.rotation = Quaternion.AngleAxis (90.0f, transform.right)  *  Quaternion.AngleAxis (30.0f, transform.up);}
}

3.6 直接用Quaternion.AngleAxis *Quaternion.AngleAxis 实现同时绕着多轴旋转

  • 但是其中一个Quaternion 用欧拉角转化而来
  •     this.transform.rotation = Quaternion.Euler (new Vector3 (0.0f, 90.0f, 0.0f))   *  Quaternion.AngleAxis (30.0f, transform.up);

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){this.transform.rotation = Quaternion.Euler (new Vector3 (0.0f, 90.0f, 0.0f))   *  Quaternion.AngleAxis (30.0f, transform.up);}
}

3.7 下面是完整的测试草稿代码

如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class rotateTest1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//使用euler欧拉角旋转//Vector3 rotate1 = new Vector3(0,30,0);//this.transform.Rotate(rotate1);   //使用quaternion四元数,xyzw?//Quaternion quaternion1 = new Quaternion(0,0,0,0);//使用quaternion四元数,类 Vector3.zero 这种固定坐标了,固定的旋转?//Quaternion quaternion2 = Quaternion.identity;//利用unity编辑器,在unity里通过看向一个物体而实现旋转//重新给quaternion2赋值// quaternion2 = Quaternion.LookRotation(new Vector3(0,0,0));///互转//使用Euler转化为quaternion四元数//quaternion2 = Quaternion.Euler(rotate1);//使用quaternion四元数转化为Euler角//给rotate2赋值,需要先定义rotate2//Vector3 rotate2 = new Vector3(0,0,0);//rotate2 = quaternion2.eulerAngles;}// Update is called once per framevoid Update(){//使用euler欧拉角旋转//Vector3 rotate1 = new Vector3(0,30,0);//使用quaternion四元数,w,xyz ,其中w是实数部分,xyz都是*i的虚数部分//Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f); //quaternion1不能持续旋转这个方法?this.transform.Rotate(quaternion1); //只能用this.transform.rotation 旋转到指定位置,而不能持续旋转//this.transform.rotation = quaternion1;//Quaternion quaternion1 = new Quaternion(0.866f,0,0,0.5f); //Vector3 rotate2 = new Vector3(0,0,0);//rotate2 = quaternion1.eulerAngles;//this.transform.Rotate(rotate2);  // 创建一个表示xx度旋转欧拉角,然后转换为的四元数,表示绕Y轴旋转//Quaternion rotate3 = Quaternion.Euler(0, 45, 0);// 假设你有一个现有的四元数//Quaternion originalQuaternion = Quaternion.identity;// 转换为30度旋转//Quaternion newQuaternion = rotate3 * originalQuaternion;// 应用到游戏对象//this.transform.rotation = newQuaternion;// 多个四元数旋转操作相乘 *,然后转换为的四元数//其中四元数也可以被替换为 欧拉角this.transform.rotation = Quaternion.Euler (new Vector3 (0.0f, 90.0f, 0.0f))   *  Quaternion.AngleAxis (30.0f, transform.up);}
}

4 未解决的问题

4.1 不了解为啥上面有的时候可以持续旋转,有时候只能旋转1次

4.2 关于下面的匀速代码

  • 不理解下面的匀速代码
  • 不理解匀速代码下,为啥改速度没效果?改轴也没效果?

5 另外一种匀速代码

using UnityEngine;public class RotateObject : MonoBehaviour
{// 旋转速度,度/秒public float speed = 30.0f; // 旋转轴public Vector3 axis = Vector3.right; void Update(){// 计算旋转量//Time.deltaTime 是上一帧的时间,可以实现不同机器的匀速播放效果float angle = speed * Time.deltaTime;// 绕axis轴旋转objecttransform.Rotate(axis, angle);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Three.js计算机与反射艺术相结合

反射-CSDN直播反射映象https://live.csdn.net/v/460090 一.CSS部分 body {margin: 0;padding: 0;height: 100vh;overflow: hidden;display: flex;align-items: center;justify-content: center;background: black; }二.JS部分 //wccchallenge - reflection //reflection for…

PDF文件提取开源工具调研总结

概述 PDF是一种日常工作中广泛使用的跨平台文档格式,常常包含丰富的内容:包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用,尤其是RAG项目中,通过将非结构化数据转化为结构化和可访问的信息&#xff0…

从AI生成内容到虚拟现实:娱乐体验的新边界

引言 在快速发展的科技时代,娱乐行业正经历一场前所未有的变革。传统的娱乐方式正与先进技术融合,创造出全新的沉浸式体验。从AI生成的个性化内容,到虚拟现实带来的身临其境的互动场景,科技不仅改变了我们消费娱乐的方式&#xf…

pthread_create函数

函数原型 pthread_create 是 POSIX 线程&#xff08;pthread&#xff09;库中的一个函数&#xff0c;用于在程序中创建一个新线程。 #include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *a…

《offer 来了:Java 面试核心知识点精讲 -- 原理篇》

在 Java 面试的战场上&#xff0c;只知皮毛可不行&#xff0c;面试官们越来越看重对原理的理解。今天就给大家分享一本能让你在面试中脱颖而出的 “武林秘籍”——《offer 来了&#xff1a;Java 面试核心知识点精讲 -- 原理篇》。 本书详细介绍了Java架构师在BAT和移动互联网公…

家政服务小程序,打造智慧家政新体验

春节即将来临&#xff0c;家政市场呈现出了火热的场景&#xff0c;大众对家政服务的需求持续增加。 近年来&#xff0c;家政市场开始倾向数字化、智能化&#xff0c;借助科学技术打造家政数字化平台&#xff0c;让大众在手机上就可以预约家政服务&#xff0c;减少传统家政市场…

vim练级攻略(精简版)

vim推荐配置: curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh 0. 规定 Ctrl-λ 等价于 <C-λ> :command 等价于 :command <回车> n 等价于 数字 blank字符 等价于 空格&#xff0c;tab&am…

Java-数据结构-二叉树习题(1)

对于二叉树的学习&#xff0c;主要的还是得多多练习~毕竟二叉树属于新的知识&#xff0c;并且也并不是线性结构&#xff0c;再加上经常使用递归的方法解决二叉树的问题&#xff0c;所以代码的具体流程还是无法看到的&#xff0c;只能通过画图想象&#xff0c;所以还是必须多加练…

PCL K4PCS算法实现点云粗配准【2025最新版】

目录 一、算法原理1、算法概述2、算法流程3、参考文献二、 代码实现1、原始版本2、2024新版三、 结果展示本文由CSDN点云侠原创,原文链接,首发于:2020年4月27日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 博客长期更新,本文最近一次更新时间为…

09-1_信号量的理论讲解

09-1_信号量的理论讲解 信号量是操作系统中的一种同步和互斥机制&#xff0c;它通过一个计数值来表示资源的数量。通过这种方式&#xff0c;信号量可以有效地协调不同任务之间的资源使用。今天我们将深入学习信号量的基本概念、分类以及如何使用它们。 1. 信号量的基本概念 …

基于SSM汽车美容管家【提供源码+答辩PPT+文档+项目部署】(高质量源码,可定制,提供文档,免费部署到本地)

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

Android 调用系统服务接口获取屏幕投影(需要android.uid.system)

媒体投影 借助 Android 5&#xff08;API 级别 21&#xff09;中引入的 android.media.projection API&#xff0c;您可以将设备屏幕中的内容截取为可播放、录制或投屏到其他设备&#xff08;如电视&#xff09;的媒体流。 Android 14&#xff08;API 级别 34&#xff09;引入…

SpringBoot源码解析(七):应用上下文结构体系

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args Sp…

基于预共享密钥的IPsec实验

一、实验目的 &#xff08;1&#xff09;了解IPsec的原理和协议运行机制&#xff1b; &#xff08;2&#xff09;掌握IPsec身份认证的预共享密钥的配置&#xff1b; &#xff08;3&#xff09;掌握用Wireshark工具抓包分析IPsec数据包格式和协议流程。 二、实验设备与环境 &…

IIO(Industrial I/O)驱动介绍

文章目录 IIO&#xff08;Industrial I/O&#xff09;驱动是Linux内核中用于工业I/O设备的子系统&#xff0c;主要用于处理传感器数据采集和转换。以下是其关键点&#xff1a; 功能 数据采集&#xff1a;从传感器读取数据。数据处理&#xff1a;对原始数据进行滤波、校准等操作…

解决关于Xcode16提交审核报错

# 问题描述 The following issues occurred while distributing your application. Asset validation failed Invalid Executable. The executable xxx.app/Frameworks/HappyDNS.framework/HappyDNS contains bitcode.(lD:ef5dd249-731f-4731-8173-8e4a12519352) Asset valida…

PenGymy论文阅读

这里发现idea被人家先发了&#xff0c;没办法&#xff0c;资料收集的不够全面&#xff0c;现在来学习一下这个项目 这篇论文的贡献如下&#xff1a; 总的来说&#xff0c;他的主要工作是构建逼真的仿真环境&#xff0c;然后根据这个仿真环境生成真实的靶场&#xff0c;使得这个…

JavaWeb 前端基础 html + CSS 快速入门 | 018

今日推荐语 指望别人的救赎&#xff0c;势必走向毁灭——波伏娃 日期 学习内容 打卡编号2025年01月17日JavaWeb 前端基础 html CSS018 前言 哈喽&#xff0c;我是菜鸟阿康。 今天 正式进入JavaWeb 的学习&#xff0c;简单学习 html CSS 这2各前端基础部分&am…

从零搭建SpringBoot3+Vue3前后端分离项目基座,中小项目可用

文章目录 1. 后端项目搭建 1.1 环境准备1.2 数据表准备1.3 SpringBoot3项目创建1.4 MySql环境整合&#xff0c;使用druid连接池1.5 整合mybatis-plus 1.5.1 引入mybatis-plus1.5.2 配置代码生成器1.5.3 配置分页插件 1.6 整合swagger3&#xff08;knife4j&#xff09; 1.6.1 整…

大文件上传服务-后端V1V2

文章目录 大文件上传概述:minio分布式文件存储使用的一些技术校验MD5的逻辑 uploadV1 版本 1uploadv2 版本 2 大文件上传概述: 之前项目做了一个文件上传的功能,最近看到有面试会具体的问这个上传功能的细节&#xff0c;把之前做的项目拿过来总结一下&#xff0c;自己写的一个…