Geometría de tortuga en 3D

Estoy emprendiendo un pequeño proyecto en el que intento recrear el lenguaje de programación educativo Logo .

Para aquellos que no lo saben, Logo consiste en una 'tortuga' que comienza en la (x, y)ubicación (0, 0)y luego puede moverse hacia adelante y hacia atrás para dibujar líneas. Además, la tortuga puede girar a la derecha o a la izquierda infinitamente (es decir, el ángulo 'envuelve' en 360 de nuevo a cero cuando gira en el sentido de las agujas del reloj, y tiene la misma propiedad en el sentido contrario a las agujas del reloj).

Luego, los estudiantes pueden usar comandos como FDmover la tortuga hacia adelante o RTgirar hacia la derecha. Entonces, por ejemplo, el programa FD 10 RT 90 FD 10 RT 90 FD 10 RT 90 FD 10 RT 90dibujaría un cuadrado con lados de 10 unidades de longitud.

Mi tortuga tiene propiedades x, yy angle, y cuando proporciono dpara especificar la distancia a viajar, puedo calcular fácilmente los nuevos valores de xy ycon lo siguiente:

old_x = x

old_y = y

r = angle * (pi / 180)# convertir ángulo (en grados) a radianes

new_x = old_x + (d * cos(r))

new_y = old_y + (d * sin(r))

Luego trazo una línea de (old_x, old_y)a (new_x, new_y). Hasta ahora, todo bien. Puedo mover la tortuga perfectamente en dos dimensiones.

Pero, lo que me gustaría hacer ahora, es agregar UTcomandos DTa mi programa, para que sea posible mover la nariz de la tortuga hacia arriba y hacia abajo, para que ahora podamos dibujar formas en 3D. Por ejemplo, el programa FD 10 UT 90 FD 10 UT 90 FD 10 UT 90 FD 10 UT 90aún dibujaría un cuadrado, solo que ahora estaría de pie verticalmente.

Sé que mi biblioteca de gráficos (OpenGL) admite dibujar líneas en 3D, de hecho, eso es lo que ya estoy haciendo, solo que mantengo la zdimensión cero todo el tiempo y, obviamente, tendré que realizar un seguimiento de una segunda variable de ángulo para hacia arriba y hacia abajo, pero no tengo ni idea de cómo calcular el nuevo x, yy zlos valores dados dos ángulos.

¿Alguien puede ayudar? Muchos AIT.

Respuestas (3)

Los ángulos se vuelven difíciles rápidamente en dimensiones más altas, pero hay una manera bastante agradable de evitar esto.

Comencemos a modo de ejemplo en 2D. Aquí está la fórmula de movimiento que diste:

X = X + d porque r y = y + d pecado r
dónde ( X , y ) es el punto en el que se encuentra actualmente la tortuga y ( X , y ) es el punto al que va la tortuga. (Los primos son solo parte del nombre, no hay derivadas). Podemos escribir esto en notación vectorial:
[ X y ] = [ X y ] + d [ porque r pecado r ] .
el vector ( porque r , pecado r ) es un vector unitario y, de hecho, cada vector unitario se puede escribir de esta forma (en muchos lenguajes de programación, la función para hacer esto se conoce como atan2). Entonces, podemos olvidar el ángulo por completo y simplemente asumir que tenemos un vector de rumbo tu eso es un vector unitario, y la fórmula de actualización se convierte en
X = X + d tu .
Para implementar RT y LT, resulta que en lugar de necesitar convertir tu Volviendo a un ángulo y añadiéndole un ángulo, podemos rotar el vector mismo. Es decir, suponiendo que queremos rotar LT por θ radianes, la fórmula de actualización para el encabezado es
tu = [ porque θ pecado θ pecado θ porque θ ] tu .
También hay otro dato que podríamos considerar, pero se puede derivar directamente de tu , y ese es el vector unitario v noventa grados en sentido antihorario desde tu . los vectores tu y v formar un sistema de coordenadas desde el punto de vista de la tortuga.

sistema de coordenadas de tortuga

y puede derivar la fórmula de actualización de rumbo averiguando cuál sería el nuevo rumbo dentro de este sistema de coordenadas de tortuga y volviéndolo a convertir en coordenadas estándar.

Subiendo a 3D, podemos usar estas ideas muy directamente. En lugar de esto tu , v marco de coordenadas de la tortuga, tenemos un tu , v , w marco de coordenadas de tortuga de tres vectores unitarios, donde tu es el rumbo de la tortuga, v está directamente a la izquierda de la tortuga (entonces, si la tortuga fuera un avión, apunta en la dirección del ala izquierda), y w apunta directamente hacia arriba desde el punto de vista de la tortuga.

marco de coordenadas de tortuga 3d

El w es el producto cruzado de los otros dos, por lo que no es estrictamente necesario guardarlo, pero tampoco está de más almacenarlo.

Dada cualquier rotación 3D escrita como 3 × 3 matriz R , la fórmula de actualización para un marco de coordenadas es

[ tu v w ] = R [ tu v w ]
donde estamos representando los marcos de coordenadas como 3 × 3 las propias matrices. La fórmula de actualización de posición sigue siendo X = X + d tu .

Aquí hay dos matrices para usted. El primero es para LT por θ radianes (también conocido como guiñada):

[ tu v w ] = [ porque θ pecado θ 0 pecado θ porque θ 0 0 0 1 ] [ tu v w ]
Y el segundo es para UT por θ radianes (también conocido como tono):
[ tu v w ] = [ porque θ 0 pecado θ 0 1 0 pecado θ 0 porque θ ] [ tu v w ]
También puede considerar tener comandos para hacer que la tortuga gire alrededor de su rumbo.

Para resumir, la noción "correcta" de un ángulo en 3D es una 3 × 3 matriz cuyas columnas son vectores unitarios ortogonales y cuyo determinante es 1 (la otra posibilidad es 1 , pero teniendo que ser 1 es lo que hace que los vectores formen un sistema de coordenadas que satisface la regla de la mano derecha). Esto también se conoce como un elemento del grupo ortogonal especial S O ( 3 ) , si quieres buscarlo.

Otros podrían sugerir el uso de cuaterniones, pero ambos enfoques son equivalentes. Los cuaterniones en su mayoría solo te dejan escribir esto 3 × 3 matriz utilizando sólo cuatro números en lugar de nueve.


En la otra respuesta, Potato sugiere usar ángulos de Euler, pero si desea que todos los comandos hagan rotaciones desde el punto de vista de la tortuga, esto no es correcto. Su RT y LT serán siempre con respecto al plano horizontal.

En mi libro

Edgar, Gerald A. , Medida, topología y geometría fractal, Textos de pregrado en Matemáticas. Nueva York, etc.: Springer-Verlag. ix, 230 pág. 58,00 marcos alemanes/HBK (1990). ZBL0727.28003 .

en el Capítulo 7 "Temas Adicionales" propongo una geometría de tortuga 3D. (Esto está solo en la primera edición del libro. En la segunda edición, incluí diferentes temas adicionales). Además de los giros habituales (guiñada) y los giros que propones (cabeceo), también hay alabeo. Aquí está la pág. 196:
página196

En la parte inferior hay un código para un dragón tridimensional...

Tienes que hacer un seguimiento de la orientación de la nariz de tortuga en 3 D utilizando los dos ángulos ϕ (horizontales) y θ (ángulo de elevación desde la horizontal)

La dirección de avance de la unidad de la tortuga es

norte = [ porque θ porque ϕ porque θ pecado ϕ pecado θ ]

Supongamos que comienza con la tortuga en el X y avión con el morro apuntando en positivo X dirección del eje, luego el inicio ϕ = 0 y el comienzo θ = 0

Usando R T ϕ 1 decrementos ϕ por ϕ 1 y L T ϕ 1 incrementos ϕ por ϕ 1 . Similarmente, tu T θ 1 incrementos θ por θ 1 y D T θ 1 decrementos θ por θ 1 .

Luego avanzamos, la nueva posición es

PAG 2 = PAG 1 + d norte