录十六

持之以恒

3D中的旋转变换

在3D坐标系中,可以绕三个轴进行旋转,x轴,y轴,z轴。这里暂不考虑平移,所以只讨论旋转轴通过原点的情况。

一、绕坐标轴旋转

  1. 绕Z轴旋转:

  2. 绕Y轴旋转:

  3. 绕X轴旋转:

//绕z旋转,角度为弧度制
template<typename N>
Matrix4x4<N> Matrix4x4<N>::MakeRotationZ(N Angle)
{
    N sinTheta = Math<N>::Sin(Angle);
    N cosTheta = Math<N>::Cos(Angle);

    Matrix4x4<N>    rotateZ;
    rotateZ.m11 = cosTheta;
    rotateZ.m12 = sinTheta;
    rotateZ.m21 = -sinTheta;
    rotateZ.m22 = cosTheta;     

    return rotateZ; 
}

//绕y旋转,角度为弧度制
template<typename N>
Matrix4x4<N> Matrix4x4<N>::MakeRotationY(N Angle)
{     
    N sinTheta = Math<N>::Sin(Angle);
    N cosTheta = Math<N>::Cos(Angle);

    Matrix4x4f    rotateY;
    rotateY.m11 = cosTheta;
    rotateY.m13 = -sinTheta;
    rotateY.m31 = sinTheta;
    rotateY.m33 = cosTheta; 

    return rotateY; 
}

//绕x旋转,角度为弧度制
template<typename N>
Matrix4x4<N> Matrix4x4<N>::MakeRotationX(N Angle)
{     
    N sinTheta = Math<N>::Sin(Angle);
    N cosTheta = Math<N>::Cos(Angle);

    Matrix4x4<N>    rotateX;
    rotateX.m22 = cosTheta;
    rotateX.m23 = sinTheta;
    rotateX.m32 = -sinTheta;
    rotateX.m33 = cosTheta;

    return rotateX;
}

二、绕任意轴旋转

n.png

//绕任意轴旋转,,角度为弧度制
template<typename N>
Matrix4x4<N> Matrix4x4<N>::MakeRotation(const Vector3<N>& vec, N angle)
{
    N cosA = Math<N>::Cos(angle);
    N sinA = Math<N>::Sin(angle); 

    Vector3<N>  axis(vec);
    axis.Normalize();//旋转轴必须单位化

    Matrix4x4<N> mat; 
    mat.m11 = axis.x * axis.x *(1-cosA) + cosA; 
    mat.m12 = axis.x * axis.y *(1-cosA) + axis.z * sinA; 
    mat.m13 = axis.x * axis.z *(1-cosA) - axis.y * sinA; 

    mat.m21 = axis.x * axis.y*(1-cosA) - axis.z * sinA; 
    mat.m22 = axis.y * axis.y*(1-cosA) + cosA;
    mat.m23 = axis.y * axis.z*(1-cosA) + axis.x * sinA;

    mat.m31 = axis.x * axis.z*(1-cosA) + axis.y * sinA; 
    mat.m32 = axis.y * axis.z*(1-cosA) - axis.x * sinA;
    mat.m33 = axis.z * axis.z*(1-cosA) + cosA;

    return mat;
}

三、

1512970396899.jpg

源码下载:Roatation


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © 1999-2019, lu16.com, All Rights Reserved