@classmethod<EOL><INDENT>def from_properties(cls, angle, axis, invert):<DEDENT>
norm = np.linalg.norm(axis)<EOL>if norm > <NUM_LIT:0>:<EOL><INDENT>x = axis[<NUM_LIT:0>] / norm<EOL>y = axis[<NUM_LIT:1>] / norm<EOL>z = axis[<NUM_LIT:2>] / norm<EOL>c = np.cos(angle)<EOL>s = np.sin(angle)<EOL>r = (<NUM_LIT:1>-<NUM_LIT:2>*invert) * np.array([<EOL>[x*x*(<NUM_LIT:1>-c)+c  , x*y*(<NUM_LIT:1>-c)-z*s, x*z*(<NUM_LIT:1>-c)+y*s],<EOL>[x*y*(<NUM_LIT:1>-c)+z*s, y*y*(<NUM_LIT:1>-c)+c  , y*z*(<NUM_LIT:1>-c)-x*s],<EOL>[x*z*(<NUM_LIT:1>-c)-y*s, y*z*(<NUM_LIT:1>-c)+x*s, z*z*(<NUM_LIT:1>-c)+c  ]<EOL>])<EOL><DEDENT>else:<EOL><INDENT>r = np.identity(<NUM_LIT:3>) * (<NUM_LIT:1>-<NUM_LIT:2>*invert)<EOL><DEDENT>return cls(r)<EOL>
Initialize a rotation based on the properties