diff options
author | Stijn Buys <ingar@osirion.org> | 2008-07-24 17:12:32 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-07-24 17:12:32 +0000 |
commit | e24766e5d3f9da4a7a566fe7035727787f9d822b (patch) | |
tree | 6e9e230436f32c2cc041a6633fa78c08626a65de /src/math | |
parent | 5e3619aa3725833877f66c85977042130fc88c43 (diff) |
improved Track view
Diffstat (limited to 'src/math')
-rw-r--r-- | src/math/axis.cc | 17 | ||||
-rw-r--r-- | src/math/axis.h | 3 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/math/axis.cc b/src/math/axis.cc index 4d752bf..aa35d92 100644 --- a/src/math/axis.cc +++ b/src/math/axis.cc @@ -74,6 +74,23 @@ void Axis::change_roll(const float angle) { axis_vector[1].assign(up); } +// perform a rotation about an arbitrary axis +/* notes: + http://mathworld.wolfram.com/RotationFormula.html +*/ +void Axis::rotate(Vector3f const &normal, float angle) +{ + float cosa = cosf(angle); + float sina = sinf(angle); + + for (size_t i =0; i < 3; i++) { + axis_vector[i] = + axis_vector[i]*cosa + + normal * dotproduct(normal, axis_vector[i]) * (1 - cosa) + + crossproduct(axis_vector[i], normal)*sina; + } +} + /* Axis const Axis::transpose() { diff --git a/src/math/axis.h b/src/math/axis.h index d011675..1422564 100644 --- a/src/math/axis.h +++ b/src/math/axis.h @@ -48,6 +48,9 @@ public: /// change roll, rotate around forward vector (positive is left) void change_roll(const float angle); + /// rotation about an arbitrary axis + void rotate(Vector3f const &normal, float angle); + private: Vector3f axis_vector[3]; }; |