# Vector Rotation

This topic is 2296 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hi everyone,

I've been struggling along with some vector rotation stuff, which I'm actually thinking is probably quite simple.. but I'm stuck in a mental rut (having only just gotten out of my last one..).

I'm trying to do collision testing of a set of capsules and a line. The line is perfectly placed now, but the capsule set isn't. I didn't post this in the game specific forum as it's a more general problem, but the vectors are being rotated from a skeleton (which is being rotated for rendering too).

When I render the skeleton/character I do these transforms..

glTranslatef(position.x, position.y, position.z); //Character position
glRotatef(90, -1.0f, 0, 0); //Rotate the model 90 so it moves along the Z axis
glRotatef(direction * 180 / PI -120, 0.0, 1.0, 0.0); //Rotate to the characters direction
glTranslatef(end.x, end.y, end.z) //The end position of the joint

Then I draw the character.

So I've been trying to re-create these transforms when building the capsules for testing. I did think about using a matrix, but I'm really not a maths person. I started by creating an 'origin' vector for the initial position, then for each capsule I had 'capBegin' and 'capEnd' to store the vector of both ends. However this is where I've gotten stuck, I can't decide/figure out how best to the get the rotations to work. Most of the rotations I've been doing have skewed the mesh, or moved them outside any viewable area.

I've been looking through google and here, but I'm either searching the wrong things or I'm not reading them right!

So I'm looking for a bit of guidance on how to do this. I'm very much open to criticism on my being silly, so long as it comes with some help on where I'm going wrong!

##### Share on other sites
Here's some code that defines a rotation and applies it to a vector. I would normally write this code using a Vector class, but I didn't want to clutter the example. This uses boosts's quaternions, which you can replace with any quaternion implementation you like (including your own).

#include <iostream> #include <cmath> #include <boost/math/quaternion.hpp> typedef boost::math::quaternion<float> Q; // Unlike glRotatef, this takes radians Q rotation_from_angle_and_axis(float angle, float x, float y, float z) { float half_angle = angle*0.5f; float cosine_of_half_angle = std::cos(half_angle); float sine_of_half_angle = std::sin(half_angle); return Q(cosine_of_half_angle, sine_of_half_angle * x, sine_of_half_angle * y, sine_of_half_angle * z); } void rotate(Q rotation, float &x, float &y, float &z) { Q v(0.0f, x, y, z); Q v_prime = rotation * v * conj(rotation); x = v_prime.R_component_2(); y = v_prime.R_component_3(); z = v_prime.R_component_4(); } int main() { float const degrees = std::atan(1.0f)/45.0f; Q rotation = rotation_from_angle_and_axis(90.0f*degrees, -1.0f, 0.0f, 0.0f); float x = 1; float y = 2; float z = 3; rotate(rotation, x, y, z); std::cout << '(' << x << ',' << y << ',' << z << ")\n"; } 

##### Share on other sites
Thanks for your reply! I wrote this thread and then went off to work. While driving I suddenly thought 'maybe I should be using quaternions' so at least I was on the right track.

Thank you very much for taking the time to reply!

1. 1
Rutin
24
2. 2
3. 3
JoeJ
20
4. 4
5. 5

• 9
• 46
• 41
• 23
• 13
• ### Forum Statistics

• Total Topics
631749
• Total Posts
3002039
×