Hi! I’ve been stumbling on this problem a couple of times in past, and i give up, need help.
So, i have a parametric curve, something like this:
let nextPosition = new THREE.Vector3(
4*Math.sin(time),
4*Math.cos(time),
0.1*Math.sin(time*2)
); // so its almost a circle, with a little Z axis wave
So when time
grows, i move object on this curve. But i also want to rotate it to face the direction it is moving. To do that i calculate quaternion:
let direction = lastPosition.sub(nextPosition).normalize();
let quaternion = new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0,1,0), direction);
object.quaternion.copy(quaternion)
object.position.copy(nextPosition);
And it works, sorta. But when time
goes around PI/2 i get this 360 rotation:
Even tho the curve is looped perfectly and smooth, at some point it adds 360 rotation. Seems like a common rotation issue, but i have no idea currently how to overcome that.
Also, this doesnt happen if Z coordinate always 0.
Additional factors are:
- this curve to be interactive following random path.
- object is just an example, as you see on the gif, im moving some vertices-trail, and they have same issue because of quaternion. So cant really use lookAt.
Here is fiddle of the problem http://jsfiddle.net/yqLab579/