Geolocalización por marcadores orbitales en Star Citizen

Star Citizen es un videojuego en desarrollo tremendamente ambicioso. Entre sus objetivos, y no es de los más impactantes, se encuentra la simulación de una galaxia completa con sus sistemas solares, sus planetas sus lunas, sus satélites artificiales y campos de asteroides. Ciclos de día y noche reales producidos por la rotación de los planetas y demás.

Ni que decir tiene que estos planetas son enormes y que una persona perdida en uno de ellos es prácticamente imposible de encontrar. Una vez finalizado el juego (es pronto para especular) probablemente habrá algún tipo de baliza rastreable que nos permita propagar nuestra posición, pero mientras tanto no tenemos nada… ¿o tal vez sí?

Un usuario de reddit publicó recientemente un texto donde explica cómo hacerlo. Sus cálculos han sido una ayuda inestimable para la realización de este proyecto.

La clave está en los marcadores orbitales. Con el objetivo de facilitar el movimiento orbital a lo largo de un planeta sin que se haga demasiado tedioso, cada planeta cuenta con seis puntos fijos llamados marcadores orbitales. Estos puntos se encuentran distribuidos en posiciones ideales. Si el planeta en cuestión (o luna, pero voy a decir planeta a lo largo del artículo por comodidad) tiene un radio r, podemos imaginar un cubo de lado superior a 2r que circunscribe nuestro planeta. En el punto medio de cada una de sus seis caras se encuentra uno de los seis marcadores orbitales.

Debido a esto, podemos establecer un sistema de coordenadas cartesiano con origen (0, 0, 0) en el centro del planeta y cuyos ejes coincidan con las posiciones de estos marcadores orbitales. De forma que si el hipotético cubo del que hablábamos antes tuviese lado L, podríamos definir una distancia R tal que R=L/2 y fijar de esta manera las posiciones absolutas de los marcadores en nuestro sistema cartesiano de la siguiente manera:

  • OM1 (R, 0, 0)
  • OM2 (0, R, 0)
  • OM3 (0, 0, R)
  • OM4 (-R, 0, 0)
  • OM5 (0, -R, 0)
  • OM6 (0, 0, -R)

Edición de 21 de septiembre de 2019: La posición relativa de los marcadores y sus distancias variaron. A fecha de hoy el OM1 (z) es el opuesto del OM2 (-z), el OM3 (y) del OM4 (-y) y el OM5 (-x) del OM6 (x). Tuvimos que regenerar los marcos de referencia y volver a mapear todos los cuerpos celestiales.

También cabe destacar que en todo momento nosotros podemos conocer nuestra distancia a cada uno de estos marcadores orbitales ¿Space magic?, y por tanto, una vez fijado el sistema de coordenadas cartesianas y conociendo nuestra distancia a al menos cuatro puntos, podremos determinar un vector que indique nuestra posición en dicho sistema de referencia.

¿Por qué cuatro puntos?. Si solo tenemos nuestra distancia d a uno de los puntos, tenemos una infinidad de puntos que cumplen la condición de encontrarse a dicha distancia de nuestro punto de referencia, concretamente todos aquellos que se encuentren en una esfera de radio d y con centro en el punto. Si tenemos la distancia a dos puntos, el número de posibilidades se reduce a la circunferencia en la que se cortan ambas esferas. Si tenemos tres puntos, las posibilidades se reducen a dos: los dos puntos donde nuestra nueva esfera corta a la circunferencia. Con cuatro puntos, nuestra posición queda fijada.

Bueno, parece que de momento tenemos claro que gracias al marco de referencia cartesiano que hemos establecido, y conociendo las distancias de nuestra posición a varios marcadores orbitales podemos determinar nuestra posición absoluta dentro del sistema de coordenadas. Esto es lo que se conoce como un sistema ECEF (Earth-Centered, Earth-Fixed), aunque en nuestro caso lo de Earth no resulta muy apropiado, ya que a día de hoy lo estamos utilizando en las tres lunas del planeta Crussader del un lejano sistema Stanton en el videojuego.

¿Pero de qué nos sirve esto? Nosotros necesitamos poder pintar nuestra posición en un mapa si queremos que alguien nos encuentre. No nos sirve de nada tener un vector (x, y, z) que representa una posición en un sistema de coordenadas arbitrario que nosotros mismos hemos definido.

¡No hay problema, podemos hacerlo!

Una vez que tenemos nuestra posición indicada por un vector (x, y, z) con origen en (0, 0, 0) (el centro del planeta) calcular el radio del planeta es trivial. No tenemos más que calcular la norma L2 (magnitud, distancia euclídea) de dicho vector y ya lo tenemos.

Esto es muy sencillo, ya que en este juego las lunas y planetas son completamente esféricos (salvo por su orografía). En la Tierra es un poco más complicado, ya que ésta no es una esfera perfecta sino un elipsoide y por tanto tendríamos que utilizar un estándar WGS 84 que cuenta con las medidas exactas necesarias para realizar estos cálculos sobre nuestro planeta.

Si nos encontramos en un planeta esférico como ocurre en Star Citizen, todo es mucho más sencillo. Para calcular la latitud (desplazamiento respecto del ecuador), bastaría con obtener el arcoseno de ‘z’ partido por el radio del planeta (asin(z/r)) y para calcular la longitud (desplazamiento respecto del meridiano principal, que en este caso es el que se encuentra en y = 0), obtendremos la arcotangente del cociente entre ‘y’ y ‘x’ (atan2(y,x).

No olvidéis, como me ocurrió a mi, que el resultado de estas operaciones (arcoseno y arcotangente) está expresado en radianes y por tanto debemos convertirlos a grados sexagesimales antes de poder proporcionar unas medidas de latitud y longitud. (Multiplicando por 57,2958).

Una vez que tengamos este sistema en funcionamiento, podemos calcular las posiciones absolutas ECEF de varios puntos de interés dispersos por la superficie del planeta en cuestión, de forma que nos sirvan como puntos de anclaje al igual que hacemos con los marcadores orbitales para determinar nuestra posición.

He subido una biblioteca escrita en python libOMPS (Orbital Marker Positioning System) a github, que proporciona toda esta funcionalidad que he descrito, y que nos permite seleccionar algunos anclajes, introducir nuestras distancias a cada uno de ellos y calcular automáticamente nuestra latitud, longitud y altura.

Así mismo, una vez terminada la biblioteca, estoy trabajando en una aplicación web escrita en Python que hace uso de ella y nos permite dibujar un mapa (mediante un canvas html5) de la superficie del planeta, mostrándonos sobre él nuestra posición y la posición de todos los puntos de interés que hayamos determinado en el mismo, facilitando de esa manera las tareas de rescate, mientras el juego (aún en fase alpha) no nos proporcione las herramientas necesarias para ello.

Me ha resultado realmente interesante este proyecto, ya que me ha hecho trabajar con algunos conceptos de geometría básica y me ha permitido regresar superficialmente al apasionante mundo de las matemáticas con el que siempre procuro no perder contacto.

Written by: