I am using this function (from Three JS Pivot point) to rotate an Object around an axis in three.js:
// obj - your object (THREE.Object3D or derived)
// point - the point of rotation (THREE.Vector3)
// axis - the axis of rotation (normalized THREE.Vector3)
// theta - radian value of rotation
// pointIsWorld - boolean indicating the point is in world coordinates (default = false)
function rotateAboutPoint(obj, point, axis, theta, pointIsWorld){
pointIsWorld = (pointIsWorld === undefined)? false : pointIsWorld;
if(pointIsWorld){
obj.parent.localToWorld(obj.position); // compensate for world coordinate
}
obj.position.sub(point); // remove the offset
obj.position.applyAxisAngle(axis, theta); // rotate the POSITION
obj.position.add(point); // re-add the offset
if(pointIsWorld){
obj.parent.worldToLocal(obj.position); // undo world coordinates compensation
}
obj.rotateOnAxis(axis, theta); // rotate the OBJECT
}
The issue I am having, is that the transformation is persistent, as pointed out in the answer. So when i call the function again the transformation is applied from where it left off. How can I "reset" the transformation so that the provided angle is an absolute value?
The following does not work:
obj.rotation.y = 0;
Thanks in advance!
CodePudding user response:
The object's transformation is stored under obj.matrix
If you want to reset the object to have the default transformation (i.e. no scaling, rotation or translation), you can simply do:
obj.matrix.identity();
https://threejs.org/docs/index.html?q=matrix4#api/en/math/Matrix4.identity
If you want to return the object to some specific transformation that it had prior to the rotation, you could either.
- reverse previous the rotation before applying the new one:
obj.rotateOnAxis(oldAxis, -oldTheta);
or...
- store off the old transform matrix and restore it before applying the new transformation. Needs to be stored somewhere persistent (so not e.g. a local variable). Various places you could potentially store it, but one that would definitely be available to you would be the object3D User Data.
obj.userData.oldMatrix = obj.matrix.clone();
and then later re-instate it like this:
obj.matrix.copy(obj.userData.oldMatrix);
https://threejs.org/docs/index.html?q=object3D#api/en/core/Object3D.userData