Tengo un eje, definido por 2 vectores, por ejemplo, uno que apunta hacia arriba en x = 10 :
const axisStart = new Vector3(10, 0, 0) const axisEnd = new Vector3(10, 0, 1)Obtengo la dirección del eje normalizado así:
const axisDirection = new Vector3().subVectors(axisEnd, axisStart).normalize() ¿Cómo puedo rotar un vector (por ejemplo Vector3(50, 0, 0) ) alrededor de mi eje original ?
Intenté usar Vector3.applyAxisAngle(axisDirection , radians) , pero debido a que el eje se ha normalizado, la rotación ocurre alrededor del centro mundial (0, 0) y no alrededor de la posición original del eje.
Resolví esto encontrando el punto exacto en el eje alrededor del cual gira el punto, usando esta respuesta y traduciendo el pseudocódigo a mecanografiado:
getPivotPoint(pointToRotate: Vector3, axisStart: Vector3, axisEnd: Vector3) { const d = new Vector3().subVectors(axisEnd, axisStart).normalize() const v = new Vector3().subVectors(pointToRotate, axisStart) const t = v.dot(d) const pivotPoint = axisStart.add(d.multiplyScalar(t)) return pivotPoint }Luego, como señaló @Ouroborus, puedo traducir el punto, aplicar la rotación y volver a traducirlo:
rotatePointAroundAxis(pointToRotate: Vector3, axisStart: Vector3, axisEnd, radians: number) { const axisDirection = new Vector3().subVectors(axisEnd, axisStart).normalize() const pivotPoint = getPivotPoint(pointToRotate, axisStart, axisEnd) const translationToWorldCenter = new Vector3().subVectors(pointToRotate, pivotPoint) const translatedRotated = translationToWorldCenter.clone().applyAxisAngle(axisDirection, radians) const destination = pointToRotate.clone().add(translatedRotated).sub(translationToWorldCenter) return destination }El código anterior está funcionando bien, dejándolo aquí para mi yo futuro y para otros que puedan encontrarlo útil.