View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# 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.

9 replies to this topic

### #1lomateron  Members

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.

### #2Paradigm Shifter  Members

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

### #3lomateron  Members

Posted 23 February 2013 - 06:20 PM

How i set the new rotation matrix?

### #4Paradigm Shifter  Members

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

### #5lomateron  Members

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.

### #6Paradigm Shifter  Members

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

### #7lomateron  Members

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.

### #8lomateron  Members

Posted 23 February 2013 - 07:00 PM

What do i do?

### #9BornToCode  Members

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.

### #10taz0010  Members

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.