Estoy tratando de hacer un juego de Unity que permita al usuario explorar la superficie de un esferoide con forma de Tierra, basado en WGS84 .
El proyecto hasta ahora está en Github, y hay un video de YouTube de este comportamiento.
Una forma del tamaño de la Tierra es demasiado grande para Unity, así que solo genero mosaicos cerca del usuario, desplazados para que el primer mosaico esté en el punto de origen de Unity. Este bit funciona.
El asunto se está moviendo. He estado usando un enfoque en el que obtengo la posición del usuario en coordenadas ECEF , luego lo normalizo para proporcionar la orientación global para el jugador, luego traduzco al jugador hacia adelante en función de eso y su rotación.
El problema con esto es que normalizar la coordenada ECEF significa que el jugador se mueve en forma esférica, pero el esferoide WGS84 no es perfectamente esférico. Entonces, el jugador se hunde en el piso o vuela hacia arriba si llegaste al sur o al norte, respectivamente.
Mi pregunta es, ¿cómo puedo permitir que el usuario se mueva por la superficie del esferoide a modo de traducción? Siento que podría haber alguna forma de tener en cuenta el eje mayor/menor del esferoide a medida que el jugador se mueve, pero no estoy seguro de cómo hacerlo.
No tengo experiencia con Unity o gráficos por computadora, lo enfoco únicamente desde el punto de vista de la navegación.
Miremos el mundo real. Queremos viajar caminando/manejando en la superficie o volando a cierta altura. Cuando lo hacemos, nos movemos en el sistema de coordenadas local (Norte-Sur, Este-Oeste, Arriba-Abajo), no podemos ver ninguna curvatura. Suponemos que la Tierra es plana.
El problema surge cuando intentamos hacerlo en una computadora, que es despiadadamente precisa y conoce la forma de la Tierra. No podemos asumir que la Tierra es plana, no podemos asumir que la Tierra es una esfera. La Tierra es un geoide. Afortunadamente, para algunos propósitos, podemos simplificar las cosas y suponer que la Tierra es un elipsoide. Usted eligió WGS84. ¡Bueno!
Entonces, ¿cómo moverse alrededor de un elipsoide? Resolver el problema analíticamente es una pesadilla. Tenemos que hacer trampa ;) Debemos suponer que la Tierra es plana por un momento, hacer un movimiento en una dirección elegida en el sistema de coordenadas local, anotar la altitud de la nueva posición, calcular las coordenadas geodésicas globales (Lat, Long, Alt ) de ese nuevo punto y luego reemplace la altitud con la obtenida al usar el sistema de coordenadas local. En otras palabras: cada vez que avanzamos en una línea perfectamente recta y nos desviamos del elipsoide (solo un poco), obligamos a que la altitud no cambie con respecto al elipsoide.
Implementación. Debe poder traducir libremente las coordenadas entre geodésicas (Lat, Long, Alt) y ECEF. Pasar de geodésico a ECEF es fácil. Encontrar coordenadas geodésicas para una posición ECEF dada es mucho más complejo, hay muchos algoritmos diferentes, estoy seguro de que debería poder encontrar una implementación lista para usar en alguna parte. Lo que también necesitas es Local Tangent Plane y, para ser precisos, vas a usar NED. Supongamos que su objeto se encuentra inicialmente en alguna posición geodésica. Anotas la altitud (relativa al elipsoide). Luego crea un sistema de coordenadas NED local con su origen en ese punto. Luego mueve el objeto en ese sistema de coordenadas local. Anota cuánto cambió la altitud (o más bien la coordenada de Abajo). Luego debes calcular las coordenadas ECEF de esa nueva posición y transformarla a geodésica (Lat, Long, Alt). Tienes la altitud anterior, tienes el cambio de altitud en las coordenadas NED, lo que significa que conoces la nueva altitud. Luego aplica esa altitud a sus nuevas coordenadas geodésicas (reemplace brutalmente Alt en Lat/Long/Alt con un nuevo valor). Luego realiza otro movimiento en las coordenadas NED definidas para esa nueva posición. Y así...
No estoy seguro si está claro, el proceso es bastante complicado. Si no puedes entender - grita :)