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 FD
mover la tortuga hacia adelante o RT
girar hacia la derecha. Entonces, por ejemplo, el programa FD 10 RT 90 FD 10 RT 90 FD 10 RT 90 FD 10 RT 90
dibujaría un cuadrado con lados de 10 unidades de longitud.
Mi tortuga tiene propiedades x
, y
y angle
, y cuando proporciono d
para especificar la distancia a viajar, puedo calcular fácilmente los nuevos valores de x
y y
con 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 UT
comandos DT
a 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 90
aú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 z
dimensió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
, y
y z
los valores dados dos ángulos.
¿Alguien puede ayudar? Muchos AIT.
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:
atan2
). Entonces, podemos olvidar el ángulo por completo y simplemente asumir que tenemos un vector de rumbo
eso es un vector unitario, y la fórmula de actualización se convierte en
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 marco de coordenadas de la tortuga, tenemos un marco de coordenadas de tortuga de tres vectores unitarios, donde es el rumbo de la tortuga, 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 apunta directamente hacia arriba desde el punto de vista de la tortuga.
El 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 matriz , la fórmula de actualización para un marco de coordenadas es
Aquí hay dos matrices para usted. El primero es para LT por radianes (también conocido como guiñada):
Para resumir, la noción "correcta" de un ángulo en 3D es una matriz cuyas columnas son vectores unitarios ortogonales y cuyo determinante es (la otra posibilidad es , pero teniendo que ser 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 , 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 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:
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 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
Supongamos que comienza con la tortuga en el avión con el morro apuntando en positivo dirección del eje, luego el inicio y el comienzo
Usando decrementos por y incrementos por . Similarmente, incrementos por y decrementos por .
Luego avanzamos, la nueva posición es