# Rotation with Quaternion

Hi,
I have tried to rotate the position of teh vertex over an axis in 3d. But with no success. So I read some topics about programming quaternions and so on, but I didn’t find the mistake in my code. My shader is still running, but the newPos isn’t there where it habe to be …

Maybe someone knows where the code is wrong …

``````vec4 mult (vec4 qa, vec4 qb)
{
vec4 result;

result.w   = qa.w * qb.w   - dot(qa.xyz,qb.xyz);
result.xyz = cross (qa.xyz, qb.xyz) + (qa.xyz * qb.w) + (qb.xyz * qa.w);

return (result);
}

vec3 rotate (vec3 vector, vec3 axis, float angle)
{
axis = normalize(axis);
float sin_a = sin(angle/2.0);
float cos_a = cos(angle/2.0);

vec4 quaternion;
quaternion.x = axis.x * sin_a;
quaternion.y = axis.y * sin_a;
quaternion.z = axis.z * sin_a;
quaternion.w = cos_a;
quaternion   = normalize(quaternion);

vec4 rotVector = mult (quaternion, vec4 (vector.x, vector.y, vector.z, 0.0));
rotVector      = mult (rotVector, vec4 (-quaternion.x, -quaternion.y, -quaternion.z, quaternion.w));

return (rotVector.xyz);
}

// In Application:

vec4 newPos = vec4(rotate(oldPos.xyz, axis, 30.0), 1.0);
gl_Position = gl_ModelViewProjectionMatrix * vec4(newPos.xyz, 1.0);
``````

The old Position and the axis is wright, I’ve proofed this a several times. But why doesn’t this work? Your angle appears to be in degrees, but sin() and cos() expects radians.

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.