Vector Rotation

Started by
1 comment, last by Boruki 12 years ago
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!

Thanks for reading.
Advertisement
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";
}
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!

This topic is closed to new replies.

Advertisement