在3D坐标系中,可以绕三个轴进行旋转,x轴,y轴,z轴。这里暂不考虑平移,所以只讨论旋转轴通过原点的情况。
一、绕坐标轴旋转
绕Z轴旋转:
绕Y轴旋转:
绕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; }
二、绕任意轴旋转
//绕任意轴旋转,,角度为弧度制 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; }
三、
源码下载:Roatation