# Quaternion rotates by twice the angle

## Recommended Posts

Posted (edited)

Good day,

I am confused because from the way I know this is the proper way of doing it:

```    public quat angledAxis(float angle, vec3 rotationAxis){
return new quat(rotationAxis, angle);
}
public vec3 rotate(vec3 origin, vec3 point, quat angledAxis){
quat q = angledAxis;
vec3 v = point - origin;
vec3 rotatedOffset = q * v * new quat(new float[] { -q.x, -q.y, -q.z, q.w });;
return origin + rotatedOffset;
}```

but for some reason rotatedOffset should be:

`vec3 rotatedOffset = q * v;`

So that when the same quat (angledAxis) is used 360 times it reaches to the starting position twice.

Shouldn't the quaternion be multiplied with this part?

`new quat(new float[] { -q.x, -q.y, -q.z, q.w });`

so that the rotation is proper? Or am I missing something?

Edited by Sevdat

Hello.

If I understand correctly, you are trying to rotate a point relative to a given origin using a pure imaginary quaternion. In this case, the multiplication works incorrectly because you need to use quaternion multiplication instead of quaternion and vector multiplication. That is, we use the formula new_v = (q * v) * conjugate(q) as in the definition. The code will look like this:

```vec3 rotateExplicit(vec3 origin, vec3 point, quat angledAxis)
{
vec3 v = point - origin;

quat pureImaginaryQuaternion = new quat();
pureImaginaryQuaternion.x = v.x;
pureImaginaryQuaternion.y = v.y;
pureImaginaryQuaternion.z = v.z;
pureImaginaryQuaternion.w = 0.0f;
pureImaginaryQuaternion = MathLib.Mul((MathLib.Mul(angledAxis, pureImaginaryQuaternion)), MathLib.Conjugate(angledAxis));

vec3 rotatedOffset = new vec3(
pureImaginaryQuaternion.x,
pureImaginaryQuaternion.y,
pureImaginaryQuaternion.z
);
return origin + rotatedOffset;
}```

The main difference is that in this version, the vector is converted into a quaternion. Then the multiplication works as expected: the distributive property and the rules of imaginary unit multiplication are used.

But you can simply use quaternion-vector multiplication from a math library. In it, the formula from the above example is already transformed:

```vec3 rotate(vec3 origin, vec3 point, quat angledAxis)
{
vec3 v = point - origin;
vec3 rotatedOffset = MathLib.Mul(angledAxis, v);
return origin + rotatedOffset;
}```

• 1