void matrix::MakeRotation(float angle, vector axis) { if (IsZero(axis[0]) && IsZero(axis[1])) { MakeRotationZ(sgn(axis[2])*angle); return; } assert(rows == 4 && cols == 4); axis.Normalize(); float a = angle * PIf / 180.0f; float c = cos(a); float s = sin(a); float D = sqr(axis[0]) + sqr(axis[1]); float u0u1 = axis[0]*axis[1]; float u0u2 = axis[0]*axis[2]; float u1u2 = axis[1]*axis[2]; float N = c*u0u1*(sqr(axis[2])-1)/D; m[0] = c*(sqr(axis[1])+sqr(u0u2))/D + sqr(axis[0]); m[1] = N + s*axis[2] + u0u1; m[2] = -axis[1]*s + u0u2*(1-c); m[3] = 0.0f; m[4] = N - s*axis[2] + u0u1; m[5] = c*(sqr(axis[0])+sqr(u1u2))/D + sqr(axis[1]); m[6] = axis[0]*s + u1u2*(1-c); m[7] = 0.0f; m[8] = axis[1]*s + u0u2*(1-c); m[9] = -axis[0]*s + u1u2*(1-c); m[10]= c*D + sqr(axis[2]); m[11]= m[12] = m[13] = m[14] = 0.0f; m[15]= 1.0f; }