Usando esta pregunta: algoritmo de rotación de puntos 3D, pude asimilar una función de rotación básica para mi biblioteca de vectores arbitraria en javascript.
El problema es que la pregunta anterior no explica cómo girar alrededor de cualquier punto (como una órbita)
Esta biblioteca de vectores amplía el tipo de objeto Array (originalmente lo bifurqué de un proyecto antiguo y luego lo adapté para mis propios proyectos) , así que piense en cada vector como una matriz con métodos y captadores adicionales (puede encontrar el código fuente completo aquí )
Este es el método que uso para rotar el vector actual con un Vector conectado como ángulo (para que cada eje se pueda controlar por separado)
Toma los valores de coseno y seno requeridos para los tres ejes (cabeceo, balanceo, guiñada) y luego los almacena como tres vectores en una matriz.
Finalmente, multiplica cada vector en cada coordenada en consecuencia.
rotate(angle) { let cos = (angle.copy).map(val => Math.cos(angle)); let sin = (angle.copy).map(val => Math.sin(angle)); let other = [new Vector([ cos.z * cos.y, cos.z * sin.y * sin.x - sin.z * cos.x, cos.z * sin.y * cos.x + sin.z * sin.x ]), new Vector([ sin.z * cos.y, sin.z * sin.y * sin.x + cos.z * cos.x, sin.z * sin.y * cos.x - cos.z * sin.x ]), new Vector([ -sin.y, cos.y * sin.x, cos.y * cos.x ])]; let stored = point.copy; this.map((val, i) => (other[i].mul(stored)).sum); }Mi pregunta principal es, ¿cómo puedo adaptar esta herramienta para permitirme rotar alrededor de cualquier punto en el espacio 3D?
Si tienes una matriz de rotación R y quieres rotar un vector v alrededor de un punto a se debe adicionar R con a y multiplicarlo por el produrcto de v por a, entonces la fórmula para el resultado es
a + R * (va)Esto aplica igual si la multiplicación matriz-vector es desde la izquierda.