Jump to content

  • Log In with Google      Sign In   
  • Create Account


make an object that is pointing in a direction rotate to point in another direction


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
9 replies to this topic

#1 lomateron   Members   -  Reputation: 329

Like
0Likes
Like

Posted 23 February 2013 - 06:10 PM

I have some points that define an object in 3D space (lets say a pencil) and a vector that tells me the direction the pencil is already pointing to.

I want to know how to make the pencil point to another direction.

 

so I take a random point of the many that defines the pencil:         PencilP  =(a,b,c)

the direction the pencil is pointing to:                                             OldD      =(x,y,z)

the new direction i want to point to:                                                NewD     =(i,j,k)

 

How do I build the rotation matrix?

Or if there is a faster way to get to the solution I will want to know it too


Edited by lomateron, 23 February 2013 - 06:39 PM.


Sponsor:

#2 Paradigm Shifter   Crossbones+   -  Reputation: 5254

Like
0Likes
Like

Posted 23 February 2013 - 06:15 PM

If you just want it to point in a new direction, just set the new rotation matrix.

 

If you want to move smoothly from one orientation to a new one via rotation you should have a look at quaternions, which solve many of the problems you get when using an Euler angle representation for orientations.


"Most people think, great God will come from the sky, take away everything, and make everybody feel high" - Bob Marley

#3 lomateron   Members   -  Reputation: 329

Like
0Likes
Like

Posted 23 February 2013 - 06:20 PM

How i set the new rotation matrix?



#4 Paradigm Shifter   Crossbones+   -  Reputation: 5254

Like
0Likes
Like

Posted 23 February 2013 - 06:25 PM

Same way you built the original? Normally objects look along one of their local axes (e.g, looking along local +Z axis) and you transform them into world space using a look at function, or else set their rotation using Euler angles.


"Most people think, great God will come from the sky, take away everything, and make everybody feel high" - Bob Marley

#5 lomateron   Members   -  Reputation: 329

Like
0Likes
Like

Posted 23 February 2013 - 06:32 PM

"Same way you built the original" 

I don't have an original rotation matrix, I only have the points that define the pencil and the vector that define the direction the pencil is already pointing to


Edited by lomateron, 23 February 2013 - 06:35 PM.


#6 Paradigm Shifter   Crossbones+   -  Reputation: 5254

Like
0Likes
Like

Posted 23 February 2013 - 06:38 PM

Well you want to make all your objects point the same direction in their own local coordinate system (e.g. along the +Z axis) and have a look at local-world transformation matrices. Are you saying you just have a collection of points in world space? That isn't the way to go about things if you want to rotate objects in arbitrary directions. It's doable, but painful and tedious.


"Most people think, great God will come from the sky, take away everything, and make everybody feel high" - Bob Marley

#7 lomateron   Members   -  Reputation: 329

Like
0Likes
Like

Posted 23 February 2013 - 06:45 PM

I have a collection of points that make a pencil, the pencil is located in the origin and the whole pencil is alredy pointing in a direction that i know and have

now i want to rotate the pencil so the whole pencil points to another direction i give


Edited by lomateron, 23 February 2013 - 07:23 PM.


#8 lomateron   Members   -  Reputation: 329

Like
0Likes
Like

Posted 23 February 2013 - 07:00 PM

What do i do?



#9 BornToCode   Members   -  Reputation: 920

Like
1Likes
Like

Posted 23 February 2013 - 08:48 PM

I have attached some code that will help you do it. I could go into the detail of explaining it. But looking at the code would help you understand it as well. If you have any questions let me know. The code below is how i handle it in my engine

 

    Vector3 lookAtDir = direction;
    lookAtDir.Normalize();    
    float angle = Vector3::Angle(lookAtDir,Vector3::forward);
    if(Mathf::Approximately(angle,0.0f))
    {
      //We are already pointing to the direction.
      return;
    }
    //Compute sin angle
    Vector3 axisToRotate = Vector3::Cross(Vector3::forward,lookAtDir);
    float length = axisToRotate.magnitude();
    if(Mathf::Approximately(length,0.0f))
    {
      //Direction is parallel.
      //Recompute right vector based on new look at direction.
      Vector3 newright = Vector3::Cross(Vector3::up,lookAtDir);
      axisToRotate = Vector3::Cross(lookAtDir,newright);      
    }
    //Recompute final rotation.
    Quaternion to = Quaternion::AngleAxis(angle,axisToRotate);
    if(to!=localRotation)
    {
      localRotation=to;
      isDirty=true;
      Update();
    }


Edited by BornToCode, 23 February 2013 - 08:55 PM.


#10 taz0010   Members   -  Reputation: 272

Like
1Likes
Like

Posted 24 February 2013 - 01:15 AM

You have your old and new direction vectors, so the problem is simply a matter of building the rotation matrix to rotate the first vector onto the second. You use the cross and dot product to get the rotation axis and angle.

 

Assuming that oldV and newV are normalised:


axisOfRotation = crossProduct(oldV, newV).normalise(); // Depending on whether your library requires normalised rotation axes

angleOfRotation = arccos(dotProduct(oldV, newV));

 

Whatever library you're using should have a function that builds a rotation matrix from an axis and angle of rotation, so there's no need to manually code a whole bunch of math.


Edited by taz0010, 24 February 2013 - 01:21 AM.





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