Gire el objeto en un eje específico en cualquier lugar de Three.js, incluido el exterior de la malla

Intentando rotar un objeto alrededor de cualquier eje.

Por ejemplo, como una bisagra de puerta (en el borde del objeto) o un planeta alrededor del sol (fuera del objeto).

El problema parece ser definir el eje. El vector inferior de la unidad da como resultado el eje restante en el origen (centro) del objeto, por lo que es idéntico a la rotación estándar:

object2.rotateOnAxis(new THREE.Vector3(1,0,0), 0.01); // same as object1.rotation.x += 0.01; 

Ver ejemplo de código: JSFiddle

EDITAR: busca la manera de rotar alrededor de un pivote sin usar niños nesteds. Rotar a los padres de un niño proporciona una manera fácil de manipular el punto de pivote del niño, pero modificar el punto de pivote no es viable.

Ejemplo a continuación, si quisiera rotar el cubo en un movimiento de figura 8, se podría lograr con este método cambiando el elemento principal. Pero uno debería asegurarse de que la posición y la orientación del nuevo padre estén configuradas con precisión para hacer que el niño salte sin problemas entre los padres, y los movimientos complejos que no se repitan o se repiten serían muy complicados. En cambio, me gustaría (y parafrasearé el título de la pregunta) rotar un objeto en un eje específico sin usar el anidamiento de objetos en ninguna parte de la escena, incluso fuera de la malla del objeto.

Ver ejemplo de código: JSFiddle con pivots

Si desea rotar un objeto alrededor de una línea arbitraria en el espacio mundial, puede usar el siguiente método. La línea se especifica mediante un point 3D y un vector de dirección ( axis ).

 THREE.Object3D.prototype.rotateAroundWorldAxis = function() { // rotate object around axis in world space (the axis passes through point) // axis is assumed to be normalized // assumes object does not have a rotated parent var q = new THREE.Quaternion(); return function rotateAroundWorldAxis( point, axis, angle ) { q.setFromAxisAngle( axis, angle ); this.applyQuaternion( q ); this.position.sub( point ); this.position.applyQuaternion( q ); this.position.add( point ); return this; } }(); 

three.js r.85