Home > OS >  How to get angle between two vectors in 3D
How to get angle between two vectors in 3D

Time:11-22

I have two objects one sphere and a cone. I want cone to always face the sphere as shown in the images.

we have constructed the cone in local coordinate system in such a way, that the tip of the cone points upward the y-axis and the center is at the origin (0,0,0).

enter image description here

enter image description here

The angle between two 3D vectors would be

float fAngle = std::acos(dot(sphereVector, coneVector) / magnitude(sphereVector * magnitude(coneVector)));

For cone to be always facing the sphere it need to be rotated in all three axis based on the position of the sphere but i am getting only one angle from the maths formula.

How do i calculate all the three angles for the cone that it is always perpendicular to the sphere.

CodePudding user response:

First, you need the vector where the cone should point to:

direction = center_cone - center_sphere;

Then, we assume, that you've constructed your cone in the local coordinate system in such a way, that the tip of the cone points upward the y-axis and the center is at the origin (0,0,0).

The axises to rotate are:

x_axis(1, 0, 0);
y_axis(0, 1, 0);
z_axis(0, 0, 1);

Now, you simply have to project the axises to the direction vector to get the 3 angles.

Example:

float angle(vec a, vec b)
{
    return acos(dot(a, b) / (magnitude(a) * magnitude(b)));
}

vec direction = normalize(center_cone - center_sphere);

float x_rot = angle(x_axis, direction);
float y_rot = angle(y_axis, direction);
float z_rot = angle(z_axis, direction);
  • Related