Started by Apr 04 2012 12:05 AM

,
2 replies to this topic

Posted 04 April 2012 - 12:05 AM

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.

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.

Posted 04 April 2012 - 07:47 AM

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"; }

Posted 04 April 2012 - 11:17 PM

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!

Thank you very much for taking the time to reply!