El handedness es otro de los conceptos que, aún siendo simple, puede provocar dolores de cabeza si no se comprende bien desde el principio. A veces me referiré a este término como “orientación” en español, o incluso como “sistema”, aunque ninguno me parece una buena traducción, especialmente el último.
En general, se habla del handedness de un sistema de coordenadas (o equivalentemente, de una base de vectores) para referirnos a qué orientación siguen los ejes que la forman.
Así, un sistema right-handed se forma de acuerdo a la regla de la mano derecha. Hay un par de formas de verlo, pero la que más me gusta (porque me resulta más fácil de recordar) es la siguiente:
- Alinea los dedos de tu mano derecha con el eje X.
- En esta alineación, asegúrate de que la palma de la mano apunte hacia el eje Y.
- El pulgar apunta hacia el eje resultante. En este caso, si has seguido las instrucciones, el eje Z debería apuntar hacia ti, como saliendo de la pantalla.
La mano, en este caso vista desde arriba, representa un eje de coordenadas en el que X va hacia la derecha, Y va hacia arriba (hacia la cámara en la foto de arriba) y Z va hacia abajo.
Fíjate que si repitieras los pasos de arriba con tu mano izquierda, el eje Z apuntaría en el sentido contrario, alejándose de ti hacia dentro de la pantalla del ordenador. Esto daría lugar a un sistema left-handed.
Distintas APIs gráficas utilizan distintos sistemas. Así, DirectX asume una orientación left-handed, mientras que OpenGL utiliza una orientación right-handed.
Supongamos que tenemos una base de vectores \(\mathcal{B}=\{\vec{v}_{1}, \vec{v}_{2}, \vec{v}_{3}\}\). ¿Cómo podemos determinar si la base corresponde a un sistema right-handed o left-handed? Para ello, sólo tenemos que resolver este determinante:
$$\begin{vmatrix}
v_{{1}_{x}} & v_{{1}_{y}} & v_{{1}_{z}} \\
v_{{2}_{x}} & v_{{2}_{y}} & v_{{2}_{z}} \\
v_{{3}_{x}} & v_{{3}_{y}} & v_{{3}_{z}}
\end{vmatrix} = (\vec{v}_{1} \times \vec{v}_{2}) \cdot \vec{v}_{3}$$
Si el resultado del determinante es mayor que cero, la base forma un sistema right-handed. Si es menor que 0, forma un sistema left-handed.
Handedness y matriz de reflexión
Hay un tipo de transformación conocida como transformación de reflexión que, aplicado a un conjunto de puntos, refleja esos puntos en el espacio. Un ejemplo de matriz que representa una transformación de este tipo es la siguiente:
$$M = \begin{pmatrix}
-1 & 0 \\
0 & 1
\end{pmatrix}$$
La figura de abajo muestra lo que ocurre cuando se aplica esta matriz a tres puntos que definen los vértices de un triángulo:
Como puede verse, si los puntos del triángulo estaban numerados siguiendo el orden contrario a las agujas del reloj, una matriz de reflexión cambia este orden, dejando los vértices definidos en el sentido de las agujas del reloj. Fíjate, haciendo un pequeño esfuerzo de visualización, que si pudieras moverte hacia dentro de la pantalla y sobrepasaras el triángulo y los ejes de coordenadas, y luego te giraras 180º para poder ver el triángulo, lo verías exactamente igual que antes de la transformación.
Este cambio, que a priori parece inofensivo, puede ser fuente de problemas de back-culling y de iluminación, porque las APIs gráficas deducen las caras de delante y atrás de un triángulo en base al orden en que se especifican los vértices. Con esta transformación, lo que antes era la cara de delante de un triángulo se ha convertido en la cara de atrás.
Una transformación de rotación siempre preserva el handedness. Un número par de reflexiones puede representarse como una rotación, por lo que si hacemos un número par de reflexiones no cambiamos el handedness. Un número impar de reflexiones se puede representar como una rotación y una única reflexión, y ésta última cambiará el handedness.
Comentarios