首页 > 其他分享 >Unity中欧拉角

Unity中欧拉角

时间:2023-11-21 13:33:05浏览次数:25  
标签:angle 欧拉角 180 旋转 Unity 90 方位

什么是欧拉角?

(1)使用单个角度来保存方位

(2)X与Z沿自身坐标系旋转,Y沿世界坐标旋转

(3)API:Vector3 eulerAngle =this.tranform.rulerAngles;

优点:

(1)仅使用三个数字表达方位,占用空间小

(2)沿坐标轴旋转的单位维角度,符合人的思考方式

(3)任意三个数字都是合法的,不存在不合法的欧拉角

缺点:

(1)方位的表达方式不唯一

对于一个方位,存在多个欧拉角描述,因此无法判断多个欧拉角代表的角唯一是否相同

例如

--角度0,5,0和角度0,365,0

--角度0,-5,0和角度0,355,0

--角度250,0,0与角度290,180,180

为了保证任意方位都只有独一无二的表示,Unity引擎限制了角度范围,即沿X轴旋转限制在-90到90之间(圆的270度到90度,代码运行可以看出),沿Y与Z轴旋转限制在0到360之间

 

缺点:对于一个方位,存在多个欧拉角描述,因此无法判断多个欧拉角代表的角位移是否相同。比如(250,0,0)与(290,180,180)为同一个欧拉角,为了保证任意方位都只有独一无二的表示,Unity引擎限制了角度范围,即沿X轴旋转限制在-90到90之间,沿Y与Z轴 旋转限制在0到360之间。

(2)万向节死锁

物体沿X轴旋转+-90度,自身坐标系Z轴与世界坐标系Y轴将重合,此时沿Z或Y旋转时,将失去一个自由度

在万向节死锁情况下,规定沿Y轴完成绕竖直轴的全部旋转,则此时Z轴旋转为0

 

欧拉角

使用三个数字来保存方位(描述物体的朝向),使用Vector3存储但并不代表向量;代表一系列的三维基本旋转,也就是围绕一个坐标系的每个轴的一系列旋转。
  • 仅使用三个数字表达方位,占用空间小
  • 优点:三个角度(沿坐标轴旋转的单位)组成,直观,容易理解。
  • 优点:可以进行从一个方向到另一个方向旋转大于180度的角度。
  • 缺点:万向节死锁问题。
  • 缺点:对于一个方位,存在多个欧拉角描述,因此无法判断多个欧拉角代表的角位移是否相同。比如(250,0,0)与(290,180,180)为同一个欧拉角,为了保证任意方位都只有独一无二的表示,Unity引擎限制了角度范围,即沿X轴旋转限制在-90到90之间,沿Y与Z轴 旋转限制在0到360之间。

欧拉角分类

静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态 动态:即绕物体坐标系的三个轴的旋转,由于物体的旋转过程中坐标轴随着物体做着相同的旋转,所以称之为动态(存在万向节死锁问题)



 

使用transform.localEulerAngles.x或transform.rotation.eulerAngles.x输出的欧拉角与Inspector面板中的Rotation值是不一样的。

原因:Inspector面板中的Rotation值系统做了转化处理,而不是直接取的欧拉角。

 

 

    private void OutputInpectorEulers()
    {
        Vector3 angle = transform.eulerAngles;
        float x = angle.x;
        float y = angle.y;
        float z = angle.z;
 
        if (Vector3.Dot(transform.up, Vector3.up) >= 0f)
        {
            if (angle.x >= 0f && angle.x <= 90f)
            {
                x = angle.x;
            }
            if (angle.x >= 270f && angle.x <= 360f)
            {
                x = angle.x - 360f;
            }
        }
        if (Vector3.Dot(transform.up, Vector3.up) < 0f)
        {
            if (angle.x >= 0f && angle.x <= 90f)
            {
                x = 180 - angle.x;
            }
            if (angle.x >= 270f && angle.x <= 360f)
            {
                x = 180 - angle.x;
            }
        }
 
        if (angle.y > 180)
        {
            y = angle.y - 360f;
        }
 
        if (angle.z > 180)
        {
            z = angle.z - 360f;
        }
 
        Debug.Log(" Inspector Euler:  " + Mathf.Round(x) + " , " + Mathf.Round(y) + " , " + Mathf.Round(z));
    }

 

标签:angle,欧拉角,180,旋转,Unity,90,方位
From: https://www.cnblogs.com/porter/p/17846395.html

相关文章

  • Unity 按键监听
    voidUpdate(){if(Input.GetKeyDown(KeyCode.UpArrow)){TestText.text="上";}}Input.GetKeyDown(keycode.space)这是监听空格键按下,具体看keycode的枚举对应不同按键Input.GetKeyUp是判断某个按键抬起Input.GetKey是判断某个按......
  • 大话Unity Shader,带你带你从0开始了解
    前言Shader,一款中文名为着色器的东西,对于很多开发者来言它是一个神秘的存在,想学但是又不知道如何去学,或者学了一段时间又发现Get不到它的点,始终感觉游离在外,不得其法。那么本文今天就来给大家讲解一下如何从零基础入门Shader,目的在于让初学Shader的程序员或者美术er可以快速进入......
  • Unity 卡通渲染之角色篇
    前言作为新博客的第一篇,就用卡渲作为开篇叭!毕竟是个二次元乐。本篇同步发表于http://chenglixue.top/index.php/unity/73/之前使用UE的后处理做过简单的卡渲,但因其灵活性很差,很多操作都需涉及到更改管线,且奈何本人在校用的笔记本,一次build就得好久,因此放弃对卡渲的深入。如今对......
  • Unity学习笔记--数据持久化XML文件(1)
    XML相关Xml是可拓展标记语言,一种文件格式。我们使用xml来完成对数据持久化的存储。等待我们有一程序运行结束之后,将内存中的数据进行保存,(保存在硬盘/服务器)实现对数据的持久化存储。xml文件的读取和保存以及修改要点:XMl文件的加载XML文件节点的查找访问XML文件节点内......
  • Unity学习笔记--数据持久化之PlayerPrefs的使用
    数据持久化PlayerPrefs相关PlayerPrefs是Unity游戏引擎中的一个类,用于在游戏中存储和访问玩家的偏好设置和数据。它可以用来保存玩家的游戏进度、设置选项、最高分数等信息。PlayerPrefs将数据存储在本地文件中,因此可以在游戏重新启动时保持数据的持久性。//PlayerPrefs的数据......
  • Unity实现Voronoi图(性能友好,分布较为均匀
     这是一种性能友好的并且生成较为均匀的Voronoi图的实现方式  在一张网格中生成随机点,然后在取每个点周围点就不需要去做全局遍历,在自己周围的格子遍历即可usingUnityEngine;usingUnityEngine.UI;publicclassVoronoiDiagram:MonoBehaviour{publicintg......
  • Unity3D:ECS架构详解
    Unity3D是目前游戏开发领域最为流行的引擎之一,而Unity3DECS架构则是在Unity3D引擎的基础上,针对游戏开发中的实体组件系统进行优化和改进而设计的一种架构。本文将详细介绍Unity3DECS架构的技术细节和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开......
  • Unity之贴图混合
    有如下几种方式:1.CPU端逐像素根据alpha通道进行叠加1publicvoidMergeTexture(Texture2Dtt1,Texture2Dtt2,intoffsetX,intoffsetY)2{3Texture2DnewTex=newTexture2D(tt1.width,tt1.height,TextureFormat.ARGB32,false);4......
  • [Unity3D]检测鼠标点击角色移动
    学习工具Unity3D学习内容如何检测鼠标点击移动角色自己的理解原理:通过检测鼠标的光线投射(Raycast)是否与地面碰撞(RaycastHit),再检测鼠标左键(Input.GetMouseButton(0))是否点击,如果两个都符合则执行移动方法源代码如下:privateboolInteractWithMovement(){Raycas......
  • 【Unity UGUI】UGUI适配
    1/*=================================================2*FileName:SafeAreaPanel.cs3*Author:None4*UnityVersion:2021.3.20f15*Date:2023-07-2016:116*Description:UI适配组件7*History:8*---------......