Unity(2022.3.38LTS) - 旋转和方向

news2024/11/23 15:49:19

目录

一. 旋转

二. 方向

三. 总结

四. 扩展-万向锁


一. 旋转

在 Unity 中,物体的旋转可以通过欧拉角和四元数来表示和操作。

欧拉角

  • 由三个角度值(通常表示为 xyz )来定义旋转。
  • 直观易懂,但可能会出现万向锁问题。

四元数

  • 由四个值 xyzw 组成。
  • 数学上更复杂,但能避免万向锁,并且在插值等操作上更稳定。

Unity 中的相关 API

  1. 通过欧拉角设置旋转:
transform.eulerAngles = new Vector3(30f, 60f, 90f);
  1. 获取欧拉角:
Vector3 eulerAngles = transform.eulerAngles;
  1. 通过四元数设置旋转:
transform.rotation = Quaternion.Euler(30f, 60f, 90f);
  1. 获取四元数:
Quaternion rotation = transform.rotation;

在实际应用中,例如制作角色的转向动画时,可以使用 Quaternion.Slerp 来实现平滑的转向效果;在物理模拟中,可能会用到 Quaternion.RotateTowards 来逐渐调整物体的朝向。

  1. Quaternion.LookRotation
    • 用途:根据给定的方向向量创建一个旋转四元数,使得对象朝向该方向。
    • 示例:Quaternion lookRotation = Quaternion.LookRotation(Vector3.forward);
  2. Quaternion.AngleAxis
    • 用途:通过指定旋转轴和旋转角度创建一个四元数。
    • 示例:Quaternion rotation = Quaternion.AngleAxis(45f, Vector3.up);
  3. Quaternion.FromToRotation
    • 用途:创建一个从一个方向到另一个方向的旋转四元数。
    • 示例:Quaternion fromToRotation = Quaternion.FromToRotation(Vector3.forward, Vector3.back);
  4. Quaternion.Slerp
    • 用途:在两个四元数之间进行球面线性插值,实现平滑的旋转过渡。
    • 示例:Quaternion result = Quaternion.Slerp(quaternion1, quaternion2, t); 其中 t 是插值参数(0 到 1 之间)。
  5. Quaternion.Inverse
    • 用途:返回给定四元数的逆。
    • 示例:Quaternion inverse = quaternion.Inverse();
  6. Quaternion.RotateTowards
    • 用途:逐渐将一个四元数旋转朝向另一个四元数。
    • 示例:Quaternion newRotation = Quaternion.RotateTowards(currentRotation, targetRotation, maxDegreesDelta);
  7. Transform.Rotate
    • 用途:按照指定的角度围绕本地坐标轴旋转对象。
    • 示例:transform.Rotate(Vector3.up * 30f);
  8. Transform.RotateAround
    • 用途:围绕指定的点按照指定的角度旋转对象。
    • 示例:transform.RotateAround(point, Vector3.up, 30f);

以下是一个示例代码,展示如何在 Update 函数中根据按键控制物体的旋转:

using UnityEngine;

public class RotationExample : MonoBehaviour
{
    void Update()
    {
        // 按 Q 键绕 X 轴顺时针旋转
        if (Input.GetKey(KeyCode.Q))
        {
            transform.Rotate(Vector3.right * Time.deltaTime * 50f);
        }
        // 按 E 键绕 X 轴逆时针旋转
        if (Input.GetKey(KeyCode.E))
        {
            transform.Rotate(-Vector3.right * Time.deltaTime * 50f);
        }
    }
}

二. 方向

在 Unity 中,与方向相关的 API 有多种,以下是一些常见的:

  1. Vector3.forwardVector3.backVector3.leftVector3.rightVector3.upVector3.down

    • 这些是预定义的常量向量,表示常见的方向。例如,Vector3.forward 表示沿着 Z 轴正方向(0, 0, 1)。
  2. Vector3.normalized

    • 用于将一个向量归一化,使其长度为 1,同时保持方向不变。
  3. Vector3.Dot

    • 计算两个向量的点积。点积的结果可以用于判断两个向量的方向关系。如果点积为正,两个向量的夹角小于 90 度;为零,夹角为 90 度;为负,夹角大于 90 度。
  4. Vector3.Cross

    • 计算两个向量的叉积,得到一个垂直于这两个向量的新向量,常用于确定平面的法向量或判断方向的旋转。
  5. Quaternion * Vector3

    • 可以通过四元数与向量相乘来旋转向量,从而改变其方向。

在 Unity 中,可以使用向量的点乘和叉乘来判断敌人相对于自身的位置关系,比如在前、后、左、右。

使用点乘判断前后位置

假设自身的朝向向量为 forward,敌人的位置向量为 enemyPosition - transform.position(其中 transform.position 是自身的位置)。

点乘结果大于 0,表示敌人在前方;点乘结果等于 0,表示敌人与自身朝向垂直;点乘结果小于 0,表示敌人在后方。

使用叉乘判断左右位置

同样基于自身的朝向向量 forward 和敌人的相对位置向量 toEnemy

叉乘结果的 y 分量大于 0,表示敌人在左侧;叉乘结果的 y 分量小于 0,表示敌人在右侧;叉乘结果的 y 分量等于 0,表示敌人在自身朝向的直线上(不考虑前后)。

using UnityEngine;

public class DirectionExample : MonoBehaviour
{
    void Update()
    {
        // 计算两个向量的点积
        Vector3 vec1 = new Vector3(1, 0, 0);
        Vector3 vec2 = new Vector3(0, 1, 0);
        float dotProduct = Vector3.Dot(vec1, vec2);
        Debug.Log("Dot Product: " + dotProduct);

        // 计算两个向量的叉积
        Vector3 crossProduct = Vector3.Cross(vec1, vec2);
        Debug.Log("Cross Product: " + crossProduct);
    }
}

三. 总结

在 Unity 中,旋转和方向是重要的概念,以下是对它们的总结:

旋转

  • 可以通过欧拉角和四元数来表示物体的旋转状态。
    • 欧拉角直观但存在万向锁问题。
    • 四元数数学上较复杂,但能避免万向锁,在插值等操作上更稳定。
  • 相关 API 包括:
    • transform.eulerAngles 用于获取和设置欧拉角。
    • Quaternion.Euler 用于通过欧拉角创建四元数。
    • Quaternion.Slerp 等用于进行旋转的插值和过渡。

方向

  • 常用的方向表示有预定义的常量向量如 Vector3.forward 等。
  • 通过向量的运算来判断方向关系:
    • Vector3.Dot 点乘用于判断两个向量的夹角和方向关系。
    • Vector3.Cross 叉乘用于得到垂直于两个向量的新向量,可用于判断左右方向等。

在实际开发中,根据具体需求选择合适的方式来处理旋转和方向。例如,对于需要平滑旋转的动画,常使用四元数和插值方法;对于判断物体相对位置和方向,灵活运用点乘和叉乘。

四. 扩展-万向锁

在 Unity 中,万向锁(Gimbal Lock)是使用欧拉角表示旋转时可能出现的一种现象。

当旋转顺序中的两个轴重合时,就会发生万向锁。比如,在常见的欧拉角旋转顺序(先绕 X 轴,再绕 Y 轴,最后绕 Z 轴)中,如果绕 Y 轴旋转了 90 度,那么原本的 X 轴和 Z 轴就会重合。

这会导致丢失一个自由度,使得某些旋转操作无法按照预期进行,可能会出现不自然或错误的旋转结果。

为了避免万向锁带来的问题,在很多情况下会优先使用四元数来表示和操作旋转。

例如,在一个飞行模拟游戏中,如果使用欧拉角来控制飞行器的方向,当飞行器进行特定的姿态调整时,可能会突然出现异常的旋转,这就可能是万向锁导致的。

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

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

相关文章

楼宇控制与智能家居实训室解决方案

一、前言 随着物联网技术、大数据分析以及人工智能技术的不断进步,楼宇自动化和智能家居系统正逐渐改变我们的生活方式和工作方式。这些系统不仅可以提高建筑物的安全性和舒适度,还可以有效降低能耗并提升运营效率。例如,通过智能温控系统可…

无人机视角下的EasyCVR视频汇聚管理:构建全方位、智能化的AI视频监控网络

随着5G、AI、物联网(IoT)等技术的快速发展,万物互联的时代已经到来,视频技术作为信息传输和交互的重要手段,在多个领域展现出了巨大的应用潜力和价值。其中,EasyCVR视频汇聚平台与无人机结合的AI应用更是为…

快速开发知识付费软件的秘诀:敏捷开发与持续迭代

在竞争激烈的市场环境中,快速推出高质量的知识付费软件是抢占市场先机的关键。敏捷开发与持续迭代作为两种核心的软件开发方法,可以帮助开发团队在短时间内交付功能完善的产品,并通过不断优化来提升用户体验。本文将探讨如何利用敏捷开发与持…

OpenCV的编译(MinGW)

OpenCV的编译(MinGW) 一、下载opencv 在opencv的官网(Releases - OpenCV)下载我们需要的opencv的版本,以4.5.4版本为例: 之所以,使用这个4.5.4版本的编译,是因为我使用4.6.0版本的…

2024年8月15日(python管理MySQL数据库 mysql5.7读写分离 配置mycat)

一、pymysql管理数据库 1、搭建主mysql5.7 [rootmysql57 ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootmysql57 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootmysql57 ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x…

消息驱动Stream---基于SpringCloud

概要:实际开发中,服务与服务之间的通信经常会使用到消息中间件,而以往使用的一些消息中间件,比如RabbitMQ,该中间件和系统的耦合性非常高,如果我们要将RabbitMQ替换为Kafka,那么系统将会有较大的…

垃圾收集器G1ZGC详解

G1收集器(-XX:UseG1GC) G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域(Region),JVM目…

Python教程(十五):IO 编程

目录 专栏列表引言基础概念什么是IO? 同步IO vs 异步IO同步IO(Synchronous IO)异步IO(Asynchronous IO) Python中的IO标准IO标准输入和输出 文件IO文件操作的上下文管理器打开文件读取文件 高级文件操作读写二进制文件…

go注册到eureka微服务

// 注册到 Eureka,goeureka会自动30秒发送一次心跳 package mainimport ("fmt""github.com/SimonWang00/goeureka""github.com/gin-gonic/gin""github.com/robfig/cron/v3""time""wbGo/configs" )typ…

【C++小白到大牛】红黑树那些事儿

目录 前言: 一、红黑树的概念 二、红黑树的性质 三、红黑树结点的定义 四、红黑树的插入 情况一:u存在且为红 情况二:u不存在/u存在且为黑 小总结: 原码: 五、红黑树的检验 六、性能比较 前言: …

Linux知识复习第4期

web服务器的基本用法 目录 1、安装 2、启动 3、默认发布目录 1、安装 yum install nginx -y # nginx安装 yum install httpd -y # apache安装 2、启动 systemctl enable --now httpd systemctl enable --now nginx 3、默认发布目录 /usr/www/html/ # …

Python OpenCV 影像处理:影像轮廓

► 前言 上篇介绍使用OpenCV Python对于图像上的二值化操作,二值化主要用途包括图像分割、物体侦测、文字识别等。这种转换可以帮助检测图像中的物体或特定特征,并提取有用的信息,本篇基于二值化操作进行近一步的操作,透过影像梯…

一六七、Linux安装go并部署go项目

Linux 下安装 Golang 获取Golang下载地址 标准官网:https://go.dev/国内镜像官网:https://golang.google.cn/ 安装 1. 进入终端,登入root su - root2. 来到应用安装目录 cd /usr/local3. 使用 wget 下载 如果没有安装 wget 可通过软件…

《向量数据库指南》——Dopple LAbs:展望未来:构建多模态交互的尖端体验

Dopple LAbs:展望未来:构建多模态交互的尖端体验 在快速迭代的科技领域,Dopple LAbs正以其前瞻性的视野和创新精神,引领着人机交互的新篇章。Sam及其团队近期通过一系列技术突破,显著增强了其服务的沉浸感和互动性,为用户带来了前所未有的视听盛宴。以下,我们将深入探讨…

智慧农业大数据助力智慧农业建设

1. 智慧农业概述 智慧农业作为现代农业发展的重要方向,融合了互联网、大数据、云计算、物联网等现代信息技术,旨在提高农业生产效率,实现精准化管理和产品溯源。通过智慧农业的实施,可以解决传统农业面临的信息不对称、融资困难等…

打工人上班适合用的蓝牙耳机推荐?几款开放式耳机推荐

日常工作的话,我还是比较推荐开放式蓝牙耳机的,它特别适合那些需要在长时间工作中保持专注和舒适度的环境,那开放式耳机其实还有一些主要的优点: 减少耳朵疲劳:由于开放式耳机不需要紧密贴合耳朵,因此可以…

复习之 java 锁

裁员在家,没有面试机会,整理整理面试知识点吧! 不得不知道的java 锁 Java 中,提供了两种方式来实现同步互斥访问(也就是锁):synchronized 和 Lock 多线程编程中,有可能会出现多个线…

使用静态住宅代理解锁YouTube营销的新维度

YouTube作为众多跨境商家的重要营销推广阵地,YouTube的运营数据与店铺的开单息息相关。那么如何做好YouTube营销来增加产品的知名度呢?如何高效运营YouTube矩阵并防止账号间的关联呢?下文介绍的静态住宅代理就能在YouTube营销上助你一臂之力。…

HTML知识点二——表单

表单&#xff1a; 基本语法&#xff1a; <form method"post" action"xxx"><p>名字&#xff1a;<input name"name" type"text"></p><p>密码&#xff1a;<input name"pass" type"pass…

音频进阶学习二——模数和数模转换中的采样、量化和编码

文章目录 前言一、频率连续时间信号的频率数字信号的频率 二、模数转换过程A/D转换三步 三、采样确定采样频率数模转换中的插值 四、量化量化过程量化误差 五、编码总结 前言 所有软件的运行都得益于硬件上的突破&#xff0c;数字信号是从40年前就开始高速发展的领域。得益于硬…