【第018问 Unity中对Quaternion.AngleAxis的理解?】

article/2025/10/31 2:48:25

一、背景

在游戏研发过程中,有时候会对一个物体经过多次围绕不同的轴进行不同角度的旋转,从而计算得到一个方向,以此来检测在该对应的方向上是否有对应的物体或别的对象,因此本节对Quaternion.AngleAxis进行简单的记录;

二、Quaternion.AngleAxis

对该API进行理解:

  • Quaternion:四元数,这个在Unity中基本就是用于计算方位、旋转的;
  • AngleAxis:这个就表示围绕一个轴,进行指定的角度旋转

整体就是:指定一个轴,围绕该轴旋转指定的角度,得到一个新的旋转结果

三、实践

1、动画演示请添加图片描述

在上图中可以看到有两个Cube,都在以相同的角度,围绕相同的轴在旋转;这里只是简单的用了该API的结果:

 targetA.rotation = Quaternion.AngleAxis(angel, direction);targetB.rotation = Quaternion.AngleAxis(angel, direction);

Angel:代表旋转多少度,比如上图中的滑动条控制的数值0-180;当然0是不会有任何变化的;

direction:代表的是轴,也就是围绕哪一个轴进行旋转;上面的动画中只是采用基本的
Vector3.up、Vector3.right,Vector3.forward进行基本的演示。但在实际的操作中的方向大多数不是这几个基本的的方向,有更多其它的方向。

2、世界坐标轴和本地坐标轴旋转差异

动画演示:
请添加图片描述
首先将CubeA和CubeB都调整一个相同的旋转角度;然后在分别在有右侧的面板中调节参数,对它们进行旋转;可以发现旋转的实际效果是不一样的【可以根据xyz轴的方向来发明细发现】;这是因为旋转的时候采用的坐标轴不一样;
CubeA:采用世界坐标轴的方式进行旋转;
CubeB:采用的是CubeB本身的坐标轴进行旋转的;

targetA.rotation = Quaternion.AngleAxis(angel, direction);
targetB.rotation = Quaternion.AngleAxis(angel, rotationB * direction);

rotationB * direction:表示CubeB本身的指定轴的方向;比如Vector3.right表示的是右侧,但是它不能直接代表Cube本身的右侧,其中的原因是Cube本身是存在旋转的;

  • 如果CubeB不旋转,且在场景中没有父节点;或者所有的父节点都没有旋转;那么此刻CubeB右侧和Vector3.right是在同一个方向;
  • 如果CubeB旋转了,那么就需要用CubeB当前的旋转乘以Vector3.right,其结果才真正表示Cube的右侧;

3、 Quaternion相乘

如果两个旋转的方向结果相乘,那么结果会是什么:看演示
请添加图片描述
从上面的动画可以看出:

  • 对CubeA进行围绕Y轴旋转指定角度A,然后CubeB进行调节下面角度B1、B2
  • 角度A =B1+B2时,两个旋转的结果是一样的;也就是具有相同的旋转行为;
 targetA.rotation = Quaternion.AngleAxis(angel, rotationA * direction);targetB.rotation = Quaternion.AngleAxis(angelB1, rotationB * direction) *Quaternion.AngleAxis(angelB2, rotationB * direction);

两个Quaternion.AngleAxis 相乘;也就是Quaternion相乘其实就是表示两个旋转角度累加

四、源码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class QuaternionAngleAxis : MonoBehaviour
{[SerializeField] private Transform targetA;[SerializeField] private Transform targetB;[SerializeField] [Range(0, 180)] private int angel;[SerializeField] [Range(0, 180)] private int angelB1;[SerializeField] [Range(0, 180)] private int angelB2;[SerializeField] private bool isReset;public enum Axis{Up,Forward,Right,}public enum TestModel{/// <summary>/// 普通旋转/// </summary>Normal,/// <summary>/// 世界坐标和本身旋转/// </summary>WLRotation,/// <summary>/// 旋转相乘/// </summary>Mult,}private Quaternion rotationA;private Quaternion rotationB;public TestModel model;public Axis axis = Axis.Right;private Vector3 direction;private void OnDrawGizmos(){if (isReset){rotationA = targetA.rotation;rotationB = targetB.rotation;return;}switch (axis){case Axis.Forward:direction = Vector3.forward;break;case Axis.Right:direction = Vector3.right;break;case Axis.Up:direction = Vector3.up;break;}switch (model){case TestModel.Normal:NormalAngelAxis();break;case TestModel.WLRotation:WLRotationAngelAxis();break;case TestModel.Mult:MultAngelAxis();break;}}void NormalAngelAxis(){targetA.rotation = Quaternion.AngleAxis(angel, direction);targetB.rotation = Quaternion.AngleAxis(angel, direction);}void WLRotationAngelAxis(){targetA.rotation = Quaternion.AngleAxis(angel, direction);targetB.rotation = Quaternion.AngleAxis(angel, rotationB * direction);}void MultAngelAxis(){targetA.rotation = Quaternion.AngleAxis(angel, rotationA * direction);targetB.rotation = Quaternion.AngleAxis(angelB1, rotationB * direction) *Quaternion.AngleAxis(angelB2, rotationB * direction);}
}

结语:

最近好像开始长胖了–【valaki】


http://chatgpt.dhexx.cn/article/bXIVv0aY.shtml

相关文章

Unity API详解——Quaternion类

Quaternion类又称四元数&#xff0c;由x、y、z和w这4个分量组成&#xff0c;属于struct类型。在Unity中&#xff0c;用Quaternion来存储和表示对象的旋转角度。Quaternion的变换比较复杂&#xff0c;对于GameObject一般的旋转及移动&#xff0c;可以用Transform中的相关方法实现…

Unity3D - 详解Quaternion类[转载]

一、简介 Quaternion又称四元数&#xff0c;由x,y,z和w这四个分量组成&#xff0c;是由爱尔兰数学家威廉卢云哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言&#xff0c;四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话&…

【Unity】Unity常用类:向量Vector3、四元数Quaternion

文章目录 Vector3构造函数静态变量变量运算符常用方法&#xff08;静态&#xff09;OrthoNormalize&#xff08;正交标准化&#xff09;Reflect&#xff08;反射&#xff09;Lerp&#xff08;线性插值&#xff09; Quaternion构造函数静态变量变量常用方法Eular&#xff08;欧拉…

unity学习笔记——Quaternion(四元数)

本篇文章转自https://www.cnblogs.com/driftingclouds/p/6626183.html Quaternion类 Quaternion&#xff08;四元数&#xff09;用于计算Unity旋转。它们计算紧凑高效&#xff0c;不受万向节锁的困扰&#xff0c;并且可以很方便快速地进行球面插值。 Unity内部使用四元数来表…

【Unity编程】Unity中关于四元数的API详解

Unity中关于四元数的API详解 Quaternion类 Quaternion&#xff08;四元数&#xff09;用于计算Unity旋转。它们计算紧凑高效&#xff0c;不受万向节锁的困扰&#xff0c;并且可以很方便快速地进行球面插值。 Unity内部使用四元数来表示所有的旋转。 Quaternion是基于复数&am…

四元数快速入门【Quaternion】

四元数&#xff08;Quaternion&#xff09;是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述&#xff0c;以帮助理解在空间导航等应用程序中对四元数的需求。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …

四元数(Quaternion)食用指南

四元数&#xff08;Quaternion&#xff09;食用指南 “这简直就是黑魔法&#xff01;” 开发时&#xff0c;每次遇到旋转问题时总会心头一震&#xff0c;在欧拉角和四元数这两种处理方式的选择上犹豫不决&#xff0c;不知不觉就陷入了四元数的淤泥中…接下来&#xff0c;我决定…

Unity3D - 详解Quaternion类

一、简介 Quaternion又称四元数&#xff0c;由x,y,z和w这四个分量组成&#xff0c;是由爱尔兰数学家威廉卢云哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言&#xff0c;四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话&…

int 的最大值

int 的最大值 java int 类整数的最大值是 2 的 31 次方 - 1 2147483648 - 1 2147483647 可以用 Integer.MAX_VALUE 表示它&#xff0c;即 int value Integer.MAX_VALUE; Integer.MAX_VALUE 1 Integer.MIN_VALUE -2147483648 再大的数就要用 long &#xff08;最大值 …

Python获取int最大值和float最大值

计算机所能表示的最大值&#xff0c;根据你的计算机的位数决定。有机计算机是64位&#xff0c;有的是32位&#xff0c;因此具体情况各不相同。本人的电脑是64位的。 1.获得int型的最大值 import sys MAX_INTsys.maxsize print(MAX_INT)2.获得float型的最大值 ##灰常简单 max…

C语言数据类型 int、long int 最大值

一、注意&#xff1a;前提是32位计算机&#xff1a; unsigned int 0&#xff5e;4294967295 int -2147483648&#xff5e;2147483647 unsigned long 0&#xff5e;4294967295 long -2147483648&#xff5e;2147483647 long long的最大值&#xff1a;9223372036854775807 long …

C++-int最大值

uint范围 0-255 int范围 -128 - 127 -2147483647 原码1111 1111 1111 1111 1111 1111 1111 1111-2147483647-1-2147483648;由于cpu里面存的是补码计算-2147483647  补码1000 0000 0000 0000 0000 0000 0000 0001-1       补码1111 1111 1111 1111 1111 1111 1111 11…

c语言求int的最大值最小值,c语言 int最大值是多少?

喵喔喔 int最大值&#xff0c;根据编译器类型不同而变化&#xff0c;具体如下&#xff1a;1、对于16位编译器&#xff0c;int占16位(2字节)。int的最大值为32767.2、对于32位和64位编译器&#xff0c;int占32位(4字节)。int的最大值为21474836473、可以通过打印sizeof(int)查看…

C语言|int型最大值和最小值

一.int型的最值 有符号 最小值&#xff1a;-2147483647-1最大值&#xff1a;2147483647 无符号 最大值&#xff1a;0xffffffff最小值&#xff1a;0 大家可以在整形类型的取值范围限制头文件中查看&#xff1a;limits.h 二.int型最小值的原因 当我们直接给int型变量赋-214748364…

软件测试管理神器之zentao(禅道)-BUG管理

软件测试管理神器之zentao(禅道)-BUG管理 禅道在遵循其管理方式基础上&#xff0c;结合国内研发现状&#xff0c;整合了bug管理&#xff0c;测试用例管理&#xff0c;发布管理&#xff0c;文档管理等功能&#xff0c;完整的覆盖了软件研发项目的整个生命周期。在禅道软件中&…

软件测试Bug

bug组成 缺陷编号-测试管理系统自动生成缺陷标题->用简短精确的话语来描述你的bug缺陷类型--代码错误(功能--预期结果--Bug/未做功能---bG)/设计缺陷(需求不全面,考虑的场景遗漏)/界面优化(U-—致,去检查ui)缺陷等级-->致命(系统瘫痪、环境出错、无法进入下一步测试)/严…

禅道—禅道Bug管理模块

禅道官网&#xff1a;https://www.zentao.net/ 简介&#xff1a; 开源免费的项目管理软件、集产品管理、项目管理、测试管理一体以及事物管理组织管理的功能 使用原因&#xff1a; 开源 方便跟踪管理Bug使用简单易学及多种管理于一身 1、Bug操作流程 2、Bug的几种解决方案 …

软件测试bug文章,软件测试技术之说一个让你印象最深的bug?

本篇文章主要讲述软件测试技术之说一个让你印象最深的bug?,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。 今天来聊一下测试面试必问题目:说一个让你印象最深的bug? 被问到这个问题,如果面试者之前没有总结和准备过,会一下子被问懵逼,瞬间紧张…

软件测试常见Bug清单

软件测试中&#xff0c;bug的类型有很多种&#xff0c;比如&#xff1a;代码错误、界面优化、设计缺陷、需求补充和用户体验等&#xff1b; 一般情况下&#xff0c;需求补充和设计缺陷比较好区分&#xff0c;但是代码错误、界面优化和用户体验区分不是很明显&#xff1b; 下面…

禅道的Bug管理流程介绍

禅道是一款以Bug管理为核心&#xff0c;覆盖全人员、全流程的全生命周期项目管理软件。能够为项目研发提供全程支撑&#xff0c;持续对团队的研发项目进行有序的管理和跟进&#xff0c;完整覆盖研发项目的核心流程。 非常多团队关注禅道的主要原因是关注禅道作为Bug管理工具、…