这篇内容将与unity中移动旋转的控制密切相关,有关移动旋转。

主要涉及到的类:Vector3,Mathf,Quaternion,Transform。

1.三角函数

其实关于三角函数的使用并不会很常见,因为unity已经给我们提供了很多方便计算向量夹角、角度范围的方法,可以直接调用,除非我们想自己去封装一些特殊的需求,否则用unity提供给我们的方法就很简便了。但是只有理解了原理才能够明白何时怎么用,所以还是要看看其中的数学原理。

(1).角度的度量方式

  • 角度:弧长等于圆周长1/360时对应的角度为1°;
  • 弧度:弧长等于半径时为1弧度,比如π就是半圈,周长为2πr;
  • 角度和弧度之间的转换:

(2).三角函数:

(3).反三角函数:

2.向量

(1).向量常用属性:

  • Vector3.magnitude 向量长度 Vector3.sqrMagnitude向量的平方长度
    向量 v 的大小以Mathf.Sqrt(Vector3.Dot(v, v)) 方式进行计算。 但是,Sqrt 计算相当复杂, 执行时间比普通算术运算要长。计算平方数代替使用 magnitude 属性要快得多 - 计算基本相同,只是消除了执行缓慢的 Sqrt 调用。如果您只将大小用于比较距离的目的,则也可以将平方数与距离的平方进行比较, 因为这种比较也会给出相同的结果。
  • Vector3.normalized 标准化向量(单位向量)

(2).点乘: Vector3.Dot

public static float Dot (Vector3 lhs, Vector3 rhs);


应用:

(3).叉乘:Vector3.Cross

public static Vector3 Cross (Vector3 lhs, Vector3 rhs);


应用:
a.创建垂直于lhs和rhs构成的平面的向量=>自己创建坐标系。
b.判断lhs和rhs的相对位置=>根据正负判断顺逆时针关系。

(4).Vector3.Angle 计算向量间夹角

public static float Angle (Vector3 from, Vector3 to);
返回的角度为两个向量之间的无符号角度。也就是说,使用两个向量之间的两个可能角度中的较小者。结果永远不会超过 180 度。
这要比我们自己用点乘和三角函数求夹角快多了。

3.欧拉角transform.eulerAngles

欧拉角在航空领域叫做导航角,就像下图这个飞机,可以抬头低头(绕x轴),左右摇摆(绕z轴),改变前进方向(绕y轴),非常便于理解。

(1).优点:

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

(2).缺点:

a.方位的表达方式不维一:

• 对于一个方位,存在多个欧拉角描述,因此无法判断多个欧拉角代表的角位移是否相同。正如官方描述的这样:

以欧拉角表示的旋转(以度为单位)。 x、y 和 z 角表示一个围绕 Z 轴旋转 z 度、围绕 X 轴旋转 x 度、围绕 Y 轴旋转 y度的旋转。 仅使用该变量读取角度和将角度设置为绝对值。不要增大角度,因为当角度超过 360 度时,操作将失败。 请改用Transform.Rotate。

• 例如:

角度0,5,0与角度0,365,0
角度0,-5,0与角度0,355,0
角度250,0,0与角度290,180,180

b.万向节死锁:

• 物体沿X轴旋转±90度,自身坐标系Z轴与世界坐标系Y轴将重合,此时再沿Y或Z轴旋转时,将失去一个自由度。
• 在万向节死锁情况下,规定沿Y轴完成绕竖直轴的全部旋转,即此时Z轴旋转为0。

4.四元数:Quaternion qt = transform.rotation;

(1).优点:

避免万向节死锁
• this.transform.rotation *= Quaternion.Euler(0, 1, 0); 可使物体沿自身坐标Y轴旋转
• this.transform.Rotate(Vector3 eulerAngles)内部就是使用四元数相乘实现

(2).缺点:

• 难于使用,不建议单独修改某个数值。
• 存在不合法的四元数。

(3).基本使用和运算:

a.从四元数中读取欧拉角:Quaternion.eulerAngles

b.四元数左乘向量,表示将该向量按照四元数表示的角度旋转:

Quaternion.Euler : public static Quaternion Euler (float x, float y, float z);
返回一个围绕 Z 轴旋转 z 度、围绕 X 轴旋转 x 度、围绕 Y 轴旋转 y 度的旋转。
eg:

// A rotation 30 degrees around the y-axis
Quaternion rotation = Quaternion.Euler(0, 30, 0);

c.四元数之间相乘

• 两个四元数相乘可以组合旋转效果。
• 例如:

Quaternion rotation01 =Quaternion.Euler(0, 30, 0) * Quaternion.Euler(0, 20, 0);
Quaternion rotation02 = Quaternion.Euler(0, 50, 0);

rotation01 与 rotation02 相同。

5.重要应用实例:

在吃鸡、CS中手雷都是致命武器,但是我们会发现不同情况下手雷的伤害却不同,可能会和爆炸点距离、掩体、装备好坏有关,这里我们就以处理掩体和手雷爆炸造成伤害的方式,我们研究的当然是最尴尬的情况:

也就是要判断玩家是否完全躲在了掩体后面,显然这就和切点c的位置密切相关了,如果c和炸弹的连线会经过掩体,那么玩家就完全躲了进去。

那么问题就变成了如何计算切点c的位置:
a.我们已知的:玩家坐标,炸弹坐标,玩家半径
b.可以通过向量运算求出来的:

//向量a:玩家指向炸弹的向量
Vector3 a = 炸弹.tranform.position - 玩家.tranform.position;
//向量b :向量a在玩家部分的向量
Vector3 b = a.normalized * 玩家半径;
//图中的夹角:利用反余弦(这时可就用不了Vector3.angle了!!!)
float angle = Mathf.Acos( 玩家半径 / a.magnitude ) * Mathf.Red2Deg;

c.最精髓的一步来了:
切点C的坐标:就是向量b旋转到圆心和切点方向时加上玩家坐标(向量是从玩家指向外界的)。

Vector3 c = 玩家.tranform.position + Quaternion.Euler(0,-angle,0) * b;

当然这只是图示的情况,如果露出的在下面那就是:

Vector3 c = 玩家.tranform.position + Quaternion.Euler(0,angle,0) * b;

unity中3D数学相关类、属性、方法、用途总结+超级综合的案例相关推荐

  1. 三、Java基础工具(1)_常用类——数学相关类

    2018-05-13 数学相关类 一.Math类 Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数.对数.平方根和三角函数.   Math 的方法都被定义为 static 形 ...

  2. Java常用类(数学相关类 /字符串相关类/时间相关类/格式化类)

    Java类库概述 Java类库文档 https://docs.oracle.com/javase/8/docs/api/ 可以下载文档离线版本(chm格式) https://blog.csdn.net ...

  3. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  4. python实例方法不可以用类调用_python中可以直接用类调用方法吗

    python中可以直接用类调用方法吗 关注:244  答案:4  mip版 解决时间 2021-01-16 12:20 提问者 妳莂騙莪 2021-01-15 21:49 python中可以直接用类调 ...

  5. 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】

    一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步.事件驱动 特性:高性能.可维护.快速开发 用途:开发服务器和 ...

  6. android 用年月日初始化date_Android随笔之——Android时间、日期相关类和方法

    今天要讲的是Android里关于时间.日期相关类和方法.在Android中,跟时间.日期有关的类主要有Time.Calendar.Date三个类.而与日期格式化输出有关的DateFormat和Simp ...

  7. java怎么调用另一个类的方法_在一个类中访问另一个类的方法

    在一个类中访问另一个类的方法 由于Java应用程序是由若干个类构成的,因此经常需要在一个类中访问另一个类中的成员和方法,请问应该如何在一个类中访问另一个类的方法?下面是由百分网小编为大家整理的在一个类 ...

  8. Java中同一个文件里类和方法的引用

    Java中同一个文件里类和方法的引用 在项目开发时往往需要在同一个文件里创建几个类,并互相引用,但小白们搞不懂,所以我给大家讲解一下 目录 Java中同一个文件里类和方法的引用 1.权限修饰符 2.类 ...

  9. java io 文件路径_【IO流】java中文件路径(相对路径、绝对路径)相关类及方法...

    1. URL 菜鸟教程:Java URL处理 通常推荐对http等协议进行使用,若操作(file:)部分属性将无意义,建议getFile(). 相关:URLConnections 类 可以打开连接进行 ...

最新文章

  1. java的log4j的xml配置_Log4j配置实例(log4j.xml)
  2. Cocos Creator中按钮组件数组的使用
  3. Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c
  4. python 概率分布_python实现beta分布概率密度函数的方法
  5. 计算机怎么取消脱敏设置,一种敏感数据自适应的脱敏方法、系统技术方案
  6. pyecharts怎么绘制散点图_pyecharts可视化和wx的结合
  7. 微软发布 .NET Core 卸载工具,适用于 Windows 和 Mac
  8. 考研数据结构--排序汇总(自用)
  9. 无法定位程序输入点WSAPoll于动态链接库WS2-32.DLL
  10. 解压缩软件(winrar中文版)pjb 附使用说明
  11. [MUI框架]-滑动侧边栏-div同页结构
  12. python json模块_python json模块使用详情
  13. 贝塞尔插值曲线绘制软件设计
  14. 同城跑腿微信小程序制作步骤_分享下同城跑腿小程序的作用
  15. 开箱即用的后台UI框架eui(原eadmin)
  16. P4850 [IOI2009]葡萄干raisins 记忆化搜索
  17. 著名演播艺术家艾宝良入驻讯飞阅读,人工智能助力声音传承
  18. jxr怎么变成jpg_手机怎样把照片格式改为jpg
  19. 如何在wampserver添加多个本地网站
  20. Android学习记录——8.多媒体

热门文章

  1. 为SSD编程(6):总结—每个程序员都应该了解的关于固态硬盘的知识
  2. 2023情人节送另一半什么好?四款适合送女友的数码好物分享
  3. html设计应用程序,软件工程师-20个HTML5应用程序设计示例(10页)-原创力文档
  4. 软件方法(下)分析和设计第8章连载[20210723更新]
  5. 极智装修知识|如何将效果图转化为实景的家? - 分享3
  6. 酷语言COOLang
  7. 非结构化数据的定义及处理方法
  8. js判断手机是苹果(IOS)还是安卓(android)
  9. 阿里云云效GitCode迁移至GitLab仓库
  10. 一个表情包引发的悬案!