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