Unity3D-----欧拉角与四元数

2024-02-08 11:18
文章标签 unity3d 欧拉角 四元

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

欧拉角与四元数

  • 一、欧拉角
    • 1、什么是欧拉角
    • 2、欧拉角的优点
    • 3、欧拉角的缺点
      • 3.1 万向节死锁
  • 二、四元数
    • 1、什么是四元数
    • 2、基本运算
      • 2.1 与向量相乘
      • 2.2 与四元数相乘
    • 3、优点
    • 4、缺点

一、欧拉角

1、什么是欧拉角

  • 欧拉角是使用三个角度来保存方位。
  • X与Z沿自身坐标系旋转,Y沿世界坐标系旋转
  • API :Vector3 eulerAngle = this.transform.eulerAngles;
    在Unity中欧拉角就是transofrm.rotation,如图所示
    在这里插入图片描述

2、欧拉角的优点

  • 仅使用三个数字表达方位,占用空间小。
  • 沿坐标轴旋转的单位为角度,符合人的思考方式。
  • 任意三个数字都是合法的,不存在不合法的欧拉角

3、欧拉角的缺点

  • 对于同一个方位,存在多个欧拉角描述因此无法判断多个欧拉角代表的角位移是否相同。
  • 例如
    – 角度(0,5,0)与(0,365,0)
    – 角度(0,-5,0)与(0,355,0)
  • 为了保证任意方位都只有独一无二的表示,Unity引擎限制了角度范围,即沿X轴旋转限制在-90°(270°)到90°之间,沿Y与Z轴旋转限制在0°到360°之间。
    提示:在unity5.x版本当中,在面板直接修改x,y,z的值并不会受到限制,但是当用代码进行修改时,就可观察到x,y,z的值是受到限制的,以确保任意方位都只有独一无二的表示。
    可用一下代码进行测试 :
 public class EuleDem : MonoBehaviour 
{public void OnGUI(){if (GUILayout.RepeatButton("沿x轴旋转")){this.transform.eulerAngles += new Vector3(1, 0, 0);}if (GUILayout.RepeatButton("沿y轴旋转")){Vector3 euler = this.transform.eulerAngles;this.transform.eulerAngles += new Vector3(0, 1, 0);}if (GUILayout.RepeatButton("沿z轴旋转")){Vector3 euler = this.transform.eulerAngles;this.transform.eulerAngles += new Vector3(0, 0, 1);}}
}

3.1 万向节死锁

  • 物体沿X轴旋转±90度,自身坐标系Z轴与世界坐标系Y轴将重合,此时再沿Y或Z轴旋转时,将失去一个自由度。
  • 在万向节死锁情况下,规定沿Z轴完成绕竖直轴的全部旋转,即此时Y轴旋转为0
  • 可用上面的代码进行测试,先将X旋转至±90,然后再持续点击沿Y轴旋转沿Z轴旋转的按钮,会发现Y轴的角度是始终为0的,那么这就无法使物体能够进行空间上的360°旋转。
    四元数可避免万向节死锁

二、四元数

1、什么是四元数

  • Quaternion 在3D图形学中代表旋转,由一个三维向量(X/Y/Z)和一个标量(W)组成
  • 旋转轴为V,旋转弧度为h,如果使用四元数表示,则四个分量为:
    x=sin(h/2)*V.x----------y=sin(h/2)*V.y
    z=sin(h/2)*V.z----------w=cos(h/2)
  • X,Y,Z,W的取值范围是-1到1.
  • API : Quaternion qt=this.transform.rotation
    将模式调整为debug模式,可看到四元数
    在这里插入图片描述

2、基本运算

2.1 与向量相乘

  • 四元数左乘向量,表示将该向量按照四元数表示的角度旋转。
  • 例如
    Vector3 point=new Vecotor3(0,0,10)
    Vector3 newPoint = Quaternion.Euler(0,30,0) * point

2.2 与四元数相乘

  • 两个四元数相乘可以组合旋转效果
  • 例如
Quaternion rotation01=Quaternion.Euler(0,30,0) * Quaternion.Euler(0,20,0);
Quaternion rotation02=Quaternion.Euler(0,50,0)
rotation01与rotation02效果是一样的

3、优点

  • 可避免万向节死锁

4、缺点

  • 难于使用,不建议单独修改某个数值,可能会出现异常
  • 存在不合法的四元数

这篇关于Unity3D-----欧拉角与四元数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam = Camera.main; // pre-defined...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray

Unity3D Shader详解:只画顶点或只画线框

在Unity3D开发中,Shader是控制渲染过程的关键组件,它允许开发者自定义物体的渲染方式。有时,为了特定的视觉效果,我们可能需要只渲染模型的顶点或者只显示其线框。下面,我们将详细探讨这两种效果的技术实现,并给出相应的代码示例。 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 只画顶点 在Unity中直接“只画顶点”的概念可能不是非常直观,因为顶点本身只是模型

Unity中使用四元数限制旋转

前言         在处理旋转相关的内容的时候,如果使用unity提供的欧拉角描述旋转,会出现一下两种问题 同一旋转的表示不唯一万向节死锁         绕轴90°旋转与绕轴90°+360°旋转的表现是一致的         当某个特定轴达到某个特殊值时,绕一个轴旋转可能会覆盖另一个轴的旋转从而失去一维自由度Unity中x轴达到90度时,会产生万向节死锁。x轴为90度,此时调节y或z轴

Unity3D ARPG(动作角色扮演游戏)设计与实现详解

动作角色扮演游戏(Action Role-Playing Game, ARPG)结合了传统角色扮演游戏(RPG)的深度与动作游戏(Action Game)的即时反应和流畅战斗体验。Unity3D 作为一款强大的跨平台游戏开发引擎,为开发者提供了丰富的工具和资源来创建高质量的 ARPG 游戏。本文将详细介绍如何使用 Unity3D 设计和实现一个基本的 ARPG 游戏,包括技术选型、游戏架构、关键系

(转)Unity3D 三种移动方式

第一种移动方式: 首先在方法外声明刚体:private Rigidbody body; 为了明显,可定义一个速度:public float speed; void Start(){ speed = 10f; body = GetCompoente(); } void Update(){ //第一种移动方式:直接修改Transform属性 //如果是球体,自身不会旋转 if(In

Unity3D中控制3D场景中游戏对象显示层级的详解

前言 在Unity3D开发中,控制游戏对象的显示层级(也称为渲染顺序或渲染层级)是一个常见的需求,特别是在处理复杂的3D场景时,如角色、道具、UI元素等的可见性和渲染顺序的管理变得尤为重要。Unity通过几种不同的机制来实现对游戏对象显示层级的控制,包括使用Sorting Layers、Sorting Order以及Camera的Culling Mask等。下面将详细解释这些机制,并提供相应的代

Unity3D关于AI的编写代码

1. Unity3D简单AI编写   由于这次介绍的AI很简单,代码直接贴上,AI分成四个状态:思考,转身,移动,攻击,这里只是初步实现,所以想实现简单点的操作,就像自动范围内随机移动,锁敌攻击,超出距离复位,近距离察觉等。   1 Enemy_AI.js   2   3 private var Regression : Vector3;   4 public var Player_

【Unity3D】【UI】Cannot restructure Prefab instance.

触发原因未知,猜测是策划把别的预设A挪了一个改了个名字成了预设B。想要改动预设B中的组件产生了一下报错。 Cannot restructure Prefab instance. Children of a Prefab instance cannot be deleted or moved,and components cannot be reordered. You can open th