nuclear@1: #include "basis.h" nuclear@1: #include "vmath.h" nuclear@1: nuclear@1: Basis::Basis() nuclear@1: { nuclear@1: i = Vector3(1, 0, 0); nuclear@1: j = Vector3(0, 1, 0); nuclear@1: k = Vector3(0, 0, 1); nuclear@1: } nuclear@1: nuclear@1: Basis::Basis(const Vector3 &i, const Vector3 &j, const Vector3 &k) nuclear@1: { nuclear@1: this->i = i; nuclear@1: this->j = j; nuclear@1: this->k = k; nuclear@1: } nuclear@1: nuclear@1: Basis::Basis(const Vector3 &dir, bool left_handed) nuclear@1: { nuclear@1: k = dir; nuclear@1: j = Vector3(0, 1, 0); nuclear@1: i = cross_product(j, k); nuclear@1: j = cross_product(k, i); nuclear@1: } nuclear@1: nuclear@1: /** Rotate with euler angles */ nuclear@1: void Basis::rotate(scalar_t x, scalar_t y, scalar_t z) { nuclear@1: Matrix4x4 RotMat; nuclear@1: RotMat.set_rotation(Vector3(x, y, z)); nuclear@1: i.transform(RotMat); nuclear@1: j.transform(RotMat); nuclear@1: k.transform(RotMat); nuclear@1: } nuclear@1: nuclear@1: /** Rotate by axis-angle specification */ nuclear@1: void Basis::rotate(const Vector3 &axis, scalar_t angle) { nuclear@1: Quaternion q; nuclear@1: q.set_rotation(axis, angle); nuclear@1: i.transform(q); nuclear@1: j.transform(q); nuclear@1: k.transform(q); nuclear@1: } nuclear@1: nuclear@1: /** Rotate with a 4x4 matrix */ nuclear@1: void Basis::rotate(const Matrix4x4 &mat) { nuclear@1: i.transform(mat); nuclear@1: j.transform(mat); nuclear@1: k.transform(mat); nuclear@1: } nuclear@1: nuclear@1: /** Rotate with a quaternion */ nuclear@1: void Basis::rotate(const Quaternion &quat) { nuclear@1: i.transform(quat); nuclear@1: j.transform(quat); nuclear@1: k.transform(quat); nuclear@1: } nuclear@1: nuclear@1: /** Extract a rotation matrix from the orthogonal basis */ nuclear@1: Matrix3x3 Basis::create_rotation_matrix() const { nuclear@1: return Matrix3x3( i.x, j.x, k.x, nuclear@1: i.y, j.y, k.y, nuclear@1: i.z, j.z, k.z); nuclear@1: }