• 第28天3D数学


    欧拉角

    由三个角度(x,y,z)组成,在特定坐标系下用于描述物体的旋转量

    通俗的说,空间中任意旋转都可以分解成绕三个互相垂直轴的三个旋转角组成的序列

    旋转序列

    heading-pitch-bank:

    先转Y轴 按照惯性坐标系

    再转X轴 按照物体坐标系

    再转Z轴 按照物体坐标系

    Quaternion q1 = new Quaternion(0,-Mathf.Sin(45*Mathf.Deg2Rad),0,-Mathf.Cos(45*Mathf.Deg2Rad));

    获取欧拉角

    Inspector调节的rotation就是欧拉角

    transform.eulerAngles = new Vector3(1, 1, 1);       //x,y,z的旋转角度

    优点

    直观,容易理解

    万向节死锁

    四元数

    在3D空间中,任意旋转都可以表示绕着某个轴旋转一个旋转角得到

    对于给定旋转,假设为绕着n轴,旋转θ度,n轴为(x,y,z),那么可以构建四元数:

    • W=cos(θ/2)
    • X=sin(θ/2)*cos(a)
    • Y=sin(θ/2)*y
    • Z=sin(θ/2)*z
    • x,y,z在xyz方向上的偏移量(分量)
    • 如果旋转没有分量a=0°  cosa=1
    • 公式可以简写:W=cos(θ/2)
    • X=sin(θ/2)
    • Y=sin(θ/2)
    • Z=sin(θ/2)

    Quaternion

    Unity中用来表示四元数的结构体

    轴角对

    公式:

    • W=cos(θ/2)
    • X=sin(θ/2)
    • Y=sin(θ/2)
    • Z=sin(θ/2)

    API

    Quaternion.AngleAxis

    Quaternion q=Quaternion.AngleAxis(90,Vector3.up); //第一个参数是角度,第二个参数围绕哪个轴旋转,旋转方向遵守左手定则

    欧拉角和四元数的转换

    欧拉角转四元数

    Quaternion.Euler(x,y,z)

    Quaternion q=Quaternion.Euler(0,90,0);//绕着Y轴旋转90°

    四元数转欧拉角

    q.eulerAngles

    Vector3 angle=q.eulerAngles;   //欧拉角是Vector3

    负四元数

    四元数q[x,y,z,w]

    负四元数-q[-x,-y,-z,-w]

    几何意义

    q与-q所代表的旋转量是相同的

    单位四元数

    两个

    -1[0,0,0]

    1[0,0,0]

    几何意义

    表示没有旋转量的四元数

    API

    Quaternion.identity

    四元数叉乘

    四元数*四元数=四元数

    几何意义

    将两个四元数的旋转量进行叠加,等到一个新的四元数

    Quaternion q1= Quaternion.AngleAxis(-30,Vector3.up);
    Quaternion q2= Quaternion.AngleAxis(-60, Vector3.up);
    Quaternion q3 = q1 * q2;

    四元数*向量

    四元数*向量=向量

    几何意义

    将向量按照四元数的旋转量旋转,得到一个新的向量

    注:只能是四元数*向量,不能是向量*四元数

    四元数插值

    Quaternion.Slerp

    几何意义

    四元数插值计算得到的是form与to之间的插值旋转量

    LookRotation

    意义

    任意一个物体在朝向世界的正前方,也就是Z轴方向,通过旋转使其物体朝向目标向量

    LookRotation计算的就是旋转所需的旋转量

  • 相关阅读:
    UVALive-8077 Brick Walls 找规律
    UVALive-8079 Making a Team 排列组合公式化简
    UVALive-8072 Keeping On Track 树形dp 联通块之间缺失边的个数
    HDU-5534 Partial Tree 完全背包 设定初始选择
    HDU-2844 Coins 多重背包 物品数量二进制优化
    CodeForces-366C Dima and Salad 对01背包的理解 多个背包问题
    HDU-2955 Robberies 浮点数01背包 自变量和因变量位置互换
    UVALive-7197 Axles 动态规划 多个背包问题
    广义表(C++实现)
    稀疏矩阵及稀疏矩阵的压缩存储
  • 原文地址:https://www.cnblogs.com/yifengs/p/14237224.html
Copyright © 2020-2023  润新知