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

Started by
8 comments, last by taz0010 11 years, 1 month ago

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

Advertisement

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

How i set the new rotation matrix?

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

"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

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

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

What do i do?

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();
}

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.

This topic is closed to new replies.

Advertisement