Estoy usando esta función (desde Three JS Pivot point ) para rotar un objeto alrededor de un eje en 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 }El problema que tengo es que la transformación es persistente, como se señala en la respuesta. Entonces, cuando vuelvo a llamar a la función, la transformación se aplica desde donde se quedó. ¿Cómo puedo "restablecer" la transformación para que el ángulo proporcionado sea un valor absoluto?
Lo siguiente no funciona:
obj.rotation.y = 0;¡Gracias por adelantado!
La transformación del objeto se almacena en obj.matrix
Si desea restablecer el objeto para que tenga la transformación predeterminada (es decir, sin escala, rotación o traslación), puede hacer esto:
obj.matrix.identity(); obj.matrix.decompose(obj.position, obj.quaternion, obj.scale);o si solo desea restablecer la rotación a la predeterminada, puede hacer esto
obj.quaternion.identity();https://tresjs.org/docs/index.html?q=matrix4#api/en/math/Matrix4.identidad
Si desea devolver el objeto a alguna transformación específica que tenía antes de la rotación, puede hacerlo.
obj.rotateOnAxis(oldAxis, -oldTheta);o...
obj.userData.oldMatrix = obj.matrix.clone();y luego volver a instalarlo así:
obj.matrix.copy(obj.userData.oldMatrix); obj.matrix.decompose(obj.position, obj.quaternion, obj.scale);https://tresjs.org/docs/index.html?q=object3D#api/en/core/Object3D.userData