Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Don't forget to read Tuesday's email newsletter for your chance to win a free copy of Construct 2!


Vector Rotation


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 Boruki   Members   -  Reputation: 683

Like
0Likes
Like

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.

Sponsor:

#2 Álvaro   Crossbones+   -  Reputation: 13659

Like
1Likes
Like

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


#3 Boruki   Members   -  Reputation: 683

Like
0Likes
Like

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!




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS