前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[学习笔记]三维数学(4)-物体的旋转

[学习笔记]三维数学(4)-物体的旋转

作者头像
六月丶
发布2022-12-26 17:30:26
4120
发布2022-12-26 17:30:26
举报
文章被收录于专栏:六月-游戏开发六月-游戏开发

欧拉角

什么是欧拉角

用三个数去存储物体在x、y、z轴的旋转角度。

补充:

  • 为了避免万向节死锁,y和z轴取值范围都是0~360°,x轴是-90°~90°。
  • x和z轴是旋转是相对于自身坐标轴的,y轴旋转永远是相对于世界坐标轴的。 优点
  • 好理解,使用方便
  • 只用三个数表示,占用空间少,在表示方位的数据结构中是占用最少的 缺点
  • 万向节死锁 四元数 什么是四元数
  • Quaternion在3D图形学中表示旋转,由一个三维向量(X/Y/Z)和一个标量(W)组成。
  • 旋转轴为V,旋转弧度为θ,如果使用四元数表示,则四个分量为:
    • x = sin(θ/2)*V.x
    • y = sin(θ/2)*V.y
    • z = sin(θ/2)*V.z
    • w = cos(θ/2)
  • X、Y、Z、W的取值范围是-1~1。
  • API:Quaternion qt = this.transform.rotation; 四元数的运算

优点

  • 避免万向节死锁
    • 可使物体沿自身坐标Y轴旋转 this.transform.rotation *= Quaternion.Euler(0,1,0);
    • rotate内部就是使用四元数相乘实现 this.transform.Rotate(Vector3 eulerAngles)缺点
  • 难于使用,不建议单独修改某个数值。
  • 存在不合法的四元数。

实例

使用欧拉角旋转

代码如下:

代码语言:javascript
复制
public class EulerDemo : MonoBehaviour
{
    public Vector3 euler;
    void Update()
    {
        euler = this.transform.eulerAngles;
    }
    private void OnGUI()
    {
        if (GUILayout.RepeatButton("沿x轴旋转"))
        {
            this.transform.eulerAngles += Vector3.right;
        }
        if (GUILayout.RepeatButton("沿y轴旋转"))
        {
            this.transform.eulerAngles += Vector3.up;
        }
        if (GUILayout.RepeatButton("沿z轴旋转"))
        {
            this.transform.eulerAngles += Vector3.forward;
        }
    }

}

使用四元数旋转

代码如下:

代码语言:javascript
复制
public class QuaternionDemo : MonoBehaviour
{
    public Vector3 euler;
    void Update()
    {
        euler = this.transform.eulerAngles;
    }
    private void OnGUI()
    {
        if (GUILayout.RepeatButton("沿x轴旋转"))
        {
            /*
             //方法一
             Quaternion qt = new Quaternion();
            //旋转轴
            Vector3 axis = this.transform.right;
            //旋转角度
            float rad = 1 * Mathf.Deg2Rad;
            qt.x = Mathf.Sin(rad / 2) * axis.x;
            qt.y = Mathf.Sin(rad / 2) * axis.y;
            qt.z = Mathf.Sin(rad / 2) * axis.z;
            qt.w = Mathf.Cos(rad / 2);
            this.transform.rotation = qt;

            //方法二
            this.transform.rotation *= Quaternion.Euler(Vector3.right);

            //方法三
            this.transform.Rotate(Vector3.right);
            */

            this.transform.Rotate(Vector3.right);
        }
        if (GUILayout.RepeatButton("沿y轴旋转"))
        {
            this.transform.Rotate(Vector3.up);
        }
        if (GUILayout.RepeatButton("沿z轴旋转"))
        {
            this.transform.Rotate(Vector3.forward);
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020 年 01 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 欧拉角
    • 什么是欧拉角
      • 优点
      • 实例
        • 使用欧拉角旋转
          • 使用四元数旋转
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档