Probablemente sea más intuitivo rotar el objeto alrededor del eje perpendicular a la dirección de arrastre actual, ya sea incrementalmente con cada movimiento del mouse, o relativo a la posición de inicio del arrastre. Las dos opciones ofrecen interacciones de usuario ligeramente diferentes, cada una de las cuales tiene sus ventajas y desventajas.
Hay una forma relatively straightforward para convertir un ángulo y un vector 3d que representa el eje que se está girando en una matriz de rotación.
Tiene razón en que la actualización de una matriz de rotación sin procesar a través de rotaciones incrementales dará como resultado que la matriz ya no sea una matriz de rotación pura. Esto se debe a que una matriz de rotación 3x3 tiene tres veces más datos de los necesarios para representar una rotación.
Una forma más compacta de representar rotaciones es con Euler Angles, teniendo un mínimo de 3 vectores de valor. Puede tomar la rotación actual como un vector de ángulo de Euler, convertirla en una matriz, aplicar la rotación (incremental o no) y convertir la matriz de nuevo en un vector de ángulo de Euler. Ese último paso eliminaría naturalmente cualquier componente no rotacional de su matriz, de modo que una vez más terminaría con una matriz de rotación pura para el siguiente estado.
Los ángulos de Euler son conceptualmente agradables, sin embargo, es mucho trabajo realizar las conversiones de ida y vuelta.
Una opción más práctica es Quaternions (also), que son cuatro vectores de elementos. Los cuatro elementos especifican rotación y escala uniforme, y sucede que si ingresas y normalizas el vector a la longitud de la unidad, obtendrás un factor de escala de 1.0. Resulta que un valor de ángulo de eje también puede ser convertido a un valor de cuaternión muy fácilmente por
q.x = sin(0.5*angle) * axis.x;
q.y = sin(0.5*angle) * axis.y;
q.z = sin(0.5*angle) * axis.z;
q.w = cos(0.5*angle);
A continuación, puede tomar el producto de cuaternión (que utiliza la multiplicación sólo es simple y adición) del cuaternión de rotación actual e incremental rotación quaternion para obtener un nuevo cuaternión que representa la realización de ambas rotaciones. En ese punto, puede normalizar la longitud para garantizar una rotación pura, pero de lo contrario continuará combinando rotaciones iterativamente.
La conversión del cuaternión a una matriz de rotación es muy sencilla (solo usa multiplicación y adición) cuando se desea mostrar el modelo en su estado girado utilizando las API de gráficos tradicionales.
sobreestimé el efecto de la imprecisión de punto flotante. Simplemente acumulando las rotaciones funciona bien. Examinaré los cuaterniones, pero como solo estoy girando alrededor de 2 ejes, todo se ve bien. –