zoukankan      html  css  js  c++  java
  • 空间向量绕任一向量旋转计算

    假定向量P绕单位向量A旋转角度θ,得到新的向量P',则:

    P'=P * cosθ + (A×P)sinθ +A(A·P)(1 - cosθ)

    其中A为单位向量,旋转角度θ为逆时针方向旋转的角度。

    假定向量P的坐标为(px,py,pz),向量A的坐标为(ax,by,cz)

    且:

    A×P=(ay * pz- az * py, ax * pz- az * px , ax * py- ay * px)

    A·P = ax * px + ay * py + az * pz

    则:

    Px’= px * cosθ+( ay * pz- az * py)sinθ + ax (ax * px + ay * py + az * pz)(1 - cosθ)

    Py’= py * cosθ+( ax * pz- az * px)sinθ + ay (ax * px + ay * py + az * pz)(1 - cosθ)

    Pz’= pz * cosθ+( ax * py- ay * px)sinθ + az (ax * px + ay * py + az * pz)(1 - cosθ)

     1 inline FVector FVector::RotateAngleAxis( const float AngleDeg, const FVector& Axis ) const
     2 {
     3     const float S    = FMath::Sin(AngleDeg * PI / 180.f);
     4     const float C    = FMath::Cos(AngleDeg * PI / 180.f);
     5 
     6     const float XX    = Axis.X * Axis.X;
     7     const float YY    = Axis.Y * Axis.Y;
     8     const float ZZ    = Axis.Z * Axis.Z;
     9 
    10     const float XY    = Axis.X * Axis.Y;
    11     const float YZ    = Axis.Y * Axis.Z;
    12     const float ZX    = Axis.Z * Axis.X;
    13 
    14     const float XS    = Axis.X * S;
    15     const float YS    = Axis.Y * S;
    16     const float ZS    = Axis.Z * S;
    17 
    18     const float OMC    = 1.f - C;
    19 
    20     return FVector(
    21         (OMC * XX + C ) * X + (OMC * XY - ZS) * Y + (OMC * ZX + YS) * Z,
    22         (OMC * XY + ZS) * X + (OMC * YY + C ) * Y + (OMC * YZ - XS) * Z,
    23         (OMC * ZX - YS) * X + (OMC * YZ + XS) * Y + (OMC * ZZ + C ) * Z
    24         );
    25 }
  • 相关阅读:
    Oracle的启动过程共经历四个阶段:
    Oracle数据库启动原理
    Oracle LISTENER监听文件参数详解及Lsnrctl命令综述
    Oracle TNS简述
    linux 各级目录的作用
    oracle 监听器的工作原理
    插入标识列
    sql server日期格式转换方法大全
    html获取输入的值的问题
    关闭窗口 不弹出提示
  • 原文地址:https://www.cnblogs.com/wubugui/p/3734627.html
Copyright © 2011-2022 走看看