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

This topic is 2068 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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

##### Share on other sites

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.

##### Share on other sites

How i set the new rotation matrix?

##### Share on other sites

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.

##### Share on other sites

"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

##### Share on other sites

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.

##### Share on other sites

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

What do i do?

##### Share on other sites

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

##### Share on other sites

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

1. 1
Rutin
49
2. 2
3. 3
4. 4
5. 5
JoeJ
19

• 11
• 16
• 9
• 10
• 13
• ### Forum Statistics

• Total Topics
633003
• Total Posts
3009846
• ### Who's Online (See full list)

There are no registered users currently online

×