Unity3D 控制物体旋转详解 —— 自身绕轴旋转、缓慢旋转、鼠标控制旋转、欧拉数和四元数的关系...

2023-05-16


问题描述:昨天需要实现一个功能是根据指令左转90度或者右转90度,当时脑汁可能是有浆糊吧,居然要用直接赋值rotation,这样一来就要牵扯到eulerAngles和四元数的Euler函数了,结果忙活了好久没解决,bug层出,今天经过详细了解,解决了相关问题,一并把其他关于角度和旋转的知识点整理出来。


一、问题的解决:如何让物体绕自身轴旋转

直接上关键代码:

player_cube.Rotate(-90, 0, 0);

player_cube是获取的需要旋转的物体的Transform,其中-90意味着,在unity面板中 rotation 中的 x 减少90,从而实现旋转;

如果想让物体直接旋转多少度,这个是最方便快捷的方法!


二、缓慢旋转

 多见于FPS游戏中使用,用于转换摄像头角度,以下为自己以前做过的例子:(仅作参考)

//获取鼠标移动
mouse_move_velocity.y = Input.GetAxis("Mouse X");
mouse_move_velocity.x = -Input.GetAxis("Mouse Y");
//rote camera 
Vector3 target_angle = transform.rotation.eulerAngles + mouse_move_velocity; 
//限定角度
//调整周期,限定角度
if (target_angle.x > 180) target_angle.x -= 360;
if (target_angle.y > 180) target_angle.y -= 360;
target_angle = new Vector3(Mathf.Clamp(target_angle.x, X_min, X_max), Mathf.Clamp(target_angle.y, Y_min, Y_max), 0);
//转化四元角度
transform.rotation = Quaternion.Euler(target_angle);

对于限定角度的旋转实现


三、实现鼠标拖拽旋转

 以前的项目在另一个硬盘上,找不到相关的示例暂时,这里只说一下思路:

  1. 像第二部分说的那样,获取鼠标移动,当然要判断一下鼠标是否点击了要旋转的物体;
  2. 当获取到鼠标移动的时候,设置移动后所对应的旋转目标;
  3. 利用Rotate实现跟随旋转;
  4. 如果想有渐缓效果可以加额外的中间变量记录,从而达到缓慢的跟随效果,如果需要更精细,可以加animation;

四、欧拉数和四元数之间的千丝万缕

 最简单的对比就是,欧拉数是一个三维向量,在Unity的定义中就是个Vector3,而四元数顾名思义则是包含四个参数的量-Quaternion。

关于两者之间的转换:

private Quaternion quaternion;
private Vector3 transform_rotation;
public void Init()
{
    transform_rotation = quaternion.eulerAngles;
    quaternion = Quaternion.Euler(transform_rotation);
}

到这里其实就差不多能满足基本的旋转要求了,但是还有许多细节值得展开学习说明。比如四元数的本质,世界轴和自身轴,等等等等

2019/8/9 更新于鹏城实验室

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3D 控制物体旋转详解 —— 自身绕轴旋转、缓慢旋转、鼠标控制旋转、欧拉数和四元数的关系... 的相关文章

随机推荐

  • 什么是最长前缀匹配?为什么网络前缀越长,其地址块就越小,路由就越具体?

    使用 CIDR 时 xff0c 路由表中的每个项目由 网络前缀 和 下一跳地址 组成 在查找路由表时可能会得到不止一个匹配结果 应当从匹配结果中选择具有最长网络前缀的路由 xff1a 最长前缀匹配 longest prefix matchi
  • STM32 模拟串口(UART)使用

    学习目标 xff1a 由于在项目中需要用到多路的串口使用 xff0c 而自己的单片机目前来讲没法满足我们项目所需要的串口需求 xff0c 因此要对普通的GPIO进行转换为UART进行使用 从而使得我们单片机能够得到多一路的串口 学习内容 x
  • Linux(ubuntu) 基础

    本文主要讲解一些有关linux下的相关知识 xff1a 文章目录 一 shell 命令二 文件系统三 ubuntu磁盘管理操作四 Ubuntu下压缩和解压缩五 ubuntu用户和组六 ubuntu 文件权限管理七 Linux连接文件操作八
  • CentOS-7.2部署Squid服务

    一 安装Squid代理服务器 yum y install squid 1 启动Squid服务和设置开机启动 systemctl start squid systemctl enable squid 2 详解Squid服务器配置文件 默认的
  • 【Docker系列】Docker Swarm

    docker swarm 介绍 为什么不建议在生产环境中使用docker compose xff1f docker compose 单节点的问题 xff0c 多个实体机就无法适应的 多机器如何管理 xff1f 如果跨机器做scale横向扩展
  • 【mysql】远程连接服务器数据库出现 Client does not support authentication protocol requested by server的解决方法

    前言 之前已经配好了本地数据库与云服务器上的数据库的连接 xff0c 也能正常进行操作 几个月后某天打开navicat想打开此连接却弹出了个错误提示窗口 xff0c 显示Client does not support authenticat
  • Ubuntu16.04系统卡顿,刷新率低,输入有延迟

    问题 xff1a 从某次开机之后ubuntu就一直卡顿 xff0c 原本以为是cscode占用过大 xff0c 在删除部分文件后没有改善 xff0c swp也未使用 每次挂起重加载也经常出现失败的情况 在不断查找资料及更改配置文件之后 xf
  • vs code git配置及使用

    一 下载及安装git程序 浏览器中搜索git官网 xff1a https git scm com download win进行程序下载 xff0c 根据自己的系统选择不同版本 xff08 32 bit Git for Windows Set
  • 根文件系统rootfs的移植及制作镜像ramdisk.img

    根文件系统的移植 介绍 1 移植根文件系统的工具 gt busybox 1 短小精悍 2 版本更新较快 xff0c 版本之间差异不大 2 如何获取busybox 1 xff09 https busybox net downloads 选择b
  • 解决linux共享文件夹丢失的问题

    虚拟机已经设置了共享文件夹 xff0c ubuntu里 mnt hgfs 没有共享文件夹 在终端输入此命令 xff0c 即可恢复 xff08 前提必须有vmware tools安装过了 xff09 sudo vmhgfs fuse host
  • 汽车CAN总线入门,通俗易懂

    附件 xff1a 文档原件github CAN总线简介 CAN xff08 Controller Area Network xff0c 控制器局域网络 xff09 属于工业现场总线的范畴 最初CAN总线是由德国的Bosch 博世 公司为汽车
  • CAN网络管理Autosar(入门)

    一 xff0c 个人小心得 作为刚入门两个月汽车电子行业的软件工程师 xff0c 现阶段在学习汽车组合开关的测试 xff08 主要用CANoe软件 xff09 xff0c 在学习过程中总结了一些自己理解的知识点 xff0c 当然也希望得到大
  • UDS诊断系列讲解-总目录

    一 前言 欢迎大家来学习 UDS诊断从入门到熟练 专栏 xff0c 该篇为总目录 xff0c 方便以后大家直接进入需要学习的文章 正所谓独乐乐不如众乐乐 1 UDS的简介和存在意义 UDS诊断系列讲解之 1 1 UDS开篇 二 UDS应用层
  • 【UDS】ISO14229之0x19服务

    文章目录 前言一 理论描述1 服务分类2 状态掩码 二 操作步骤1 请求2 回复 总结 gt 返回总目录 lt 前言 简称 xff1a ReadDTCInformation xff0c 读取DTC信息 功能 xff1a 用户通过请求该服务
  • VScode:ERROR: Unable to start debugging. Unexpected GDB output from command “-exec-run“

    问题 ERROR Unable to start debugging Unexpected GDB output from command 34 exec run 34 During startup program exited with
  • 《诊断服务》禁止功能寻址

    文章目录 前言一 功能寻址是什么 xff1f 二 步骤1 使能制造商函数接口2 分析函数并填充代码 总结 前言 本章基于DaVinCi禁止功能寻址的办法 DaVinCi默认支持功能寻址 xff0c 因此需要特殊处理 一 功能寻址是什么 xf
  • BswM模块之Ecu State Handling

    文章目录 前言一 ESH是什么 xff1f 二 基于BswM管理的ECU状态切换流程1 ECU启动2 ECU关闭 总结 前言 BswM 基础软件模式管理模块 xff0c 它的职责是基于简单规则的BSW模块仲裁来自应用层sw c或其他模块的模
  • 【UDS】ISO15765-2之诊断时间参数

    文章目录 简介分类1 P2client2 P2server3 P2 client4 P2 server5 S3client5 S3server 总结 gt 返回总目录 lt 简介 诊断层包含六种定时器时间参数 xff1a P2client
  • 【UDS】ISO15765-2之网络时间参数

    文章目录 简介分类1 N As2 N Ar3 N Bs4 N Br5 N Cs5 N Cr 总结 gt 返回总目录 lt 简介 网络层定时参数定义了N As N Ar N Bs N Br N Cs N Cr六个参数 这些时间参数在多帧传输中
  • Unity3D 控制物体旋转详解 —— 自身绕轴旋转、缓慢旋转、鼠标控制旋转、欧拉数和四元数的关系...

    问题描述 xff1a 昨天需要实现一个功能是根据指令左转90度或者右转90度 xff0c 当时脑汁可能是有浆糊吧 xff0c 居然要用直接赋值rotation xff0c 这样一来就要牵扯到eulerAngles和四元数的Euler函数了