¿Cómo cargar un planeta esférico y sus regiones?

14

Estoy diseñando un juego parcialmente compuesto de exploración de planetas. Quiero usar la generación pseudoaleatoria para ellos, regenerando a partir de una semilla definida cuando tengo que cargarlos en lugar de almacenar cada detalle, lo que sería demasiado pesado. Así que solo almacenaré en un archivo la semilla aleatoria y las modificaciones realizadas por el jugador, si las hubiera.

El jugador debe poder ver el planeta desde la órbita (con un nivel de detalles muy bajo, luego descender al suelo, aumentando lentamente el nivel de detalles de la región donde está aterrizando y descargando los que están en los otros lados) del planeta, que salen del campo de visión del jugador.

Si tuviera que hacerlo en un terreno plano, lo haría fácilmente con un sistema de trozos cuadrados. Pero el problema aquí es que los planetas son, casi, esferas.

Entonces, ¿cuál sería la mejor manera de cargar los detalles del terreno (relieve y objetos conectados a tierra) alrededor de un punto preciso?
Ya pensé en dos soluciones, pero ambas tienen un punto débil:

1. Cortar la esfera en trozos cuadrados.

método de trozos cuadrados

Una vez que el jugador está lo suficientemente cerca del suelo, solo tengo que mejorar los detalles de los cuadrados más cercanos desde su posición.
Si no es suficiente, aún puedo cortar cada cuadro en subcuadros para cargar cuando los jugadores están en el suelo o muy cerca del suelo.

Pero como puede ver en la imagen, hay un problema si el jugador intenta aterrizar en un poste: los cuadrados se vuelven rectángulos muy delgados, o incluso triángulos para la última línea, y además el hecho de que serían muchos para cargar, La generación parecería distorsionada.

2. Partiendo de un icosaedro.

método icosaedro

Aquí, podría aumentar el mosaico de triángulos alrededor de la posición del jugador cuando él / ella se está acercando.

Pero no sé cómo ubicar triángulos cerca de la posición del jugador. Escuché que las coordenadas cartesianas podrían ser útiles en ese caso, pero no sé cómo usarlas.


Estoy usando C ++ / OpenGL para ello, por lo que lo principal para generar y cargar aquí son vértices que representan el relieve de la superficie y el color / textura.

Aracthor
fuente
Antes de empezar a escribir, ¿es tu mundo una esfera? ¿Está tratando de imponer una cuadrícula en una esfera donde cada cuadrícula tiene propiedades guardadas en un archivo?
Alec Teal
@ AlecTeal Estoy tratando de simular un planeta. Entonces es globalmente una esfera. Y el principal problema es que el jugador puede intentar aterrizar en cualquier punto, en un poste o a lo largo del ecuador.
Aracthor
2
Entonces ... tengo que preguntar si buscaste un "motor de juego mundial esférico" ya que hay muchas implementaciones allí. ¿Por qué no funcionan? Además, esta es la razón por la que tenemos mapas de cubos, ¡son los gráficos estándar en cualquier variedad topológica homeomórfica a una esfera por esta razón!
Alec Teal
1
sugiera evaluar también la opción de esfera cuádruple
dnk drone.vs.drones
maths.kisogo.com/index.php?title=Notes:Spherical_coordinates borrador preliminar. Necesita fotos y para terminar.
Alec Teal

Respuestas:

5

Bien, entonces lo escribí aquí:

http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates

(Necesitaba el marcado matemático y también es bastante largo)


Aplicando el documento

El documento comienza presentando la noción de un múltiple, un múltiple es esto donde los trozos de él son "homeomórficos" (básicamente: lo mismo que) trozos de R ^ n (R ^ 2 es el plano x / y, como podría ser saber)

Un gráfico cubre algunos (posiblemente todos, aunque en el caso de una esfera NO PUEDE cubrir todos) de una variedad.

En el artículo desarrollo 4 gráficos para la esfera que preservan los ángulos, es decir, mantienen una distancia regular.

¡Como descubriste, dar coordenadas a puntos en una esfera es realmente bastante difícil! Lo que hacemos en su lugar (aunque en un círculo en el ejemplo) es dar a cada punto una coordenada de la forma (i, x, y) donde i es un número entre 1 y 6 para una esfera, 1 y 4 para un círculo. Este es el número de la tabla.

Las x e y se refieren a los ángulos en ese gráfico (o simplemente x si es un círculo).

Los 6 gráficos de una esfera son los hemisferios superior / inferior, hemisferios izquierdo / derecho y frontal / posterior.


Coordenadas

Ahora puede darle a cada punto una coordenada "agradable" que se comporte bien. En términos matemáticos, los dominios de los gráficos son mapas "abiertos", esto significa que existe un número positivo tal que una bola alrededor de cada punto también está en el conjunto. Por ejemplo, el rango (0,1) (el conjunto que contiene x si 0 <x <1) está abierto, tome cualquier p en (0,1) (por ejemplo 0.001), entonces hay un número (por ejemplo 0.0005) tal que cualquier punto dentro de 0.0005 de 0.001 también está en (0,1).

Lo que esto significa es que puede pasar instrucciones a través de gráficos.

Ahora hay 45 grados de superposición en los gráficos que desarrollamos. Esto significa que si usted tiene una característica en las coordenadas (i, x, y) se puede especificar SEGURA puntos de la forma (i, x + a, y + b), siempre y cuando a, y bestán entre -45 y 45 (en grados)

Cualquier punto de la forma (i, x + a, y + b) puede transformarse fácilmente a un punto en el espacio tridimensional "normal" sin problema.


Implementación

Ahora tiene una manera de almacenar coordenadas para algo en una esfera, y denotar regiones grandes franjas de espacio con estas coordenadas, también se comportan como coordenadas, están abiertas, por ejemplo (lo cual es un problema si usa 2 ángulos en su lugar)

También puede descartar totalmente las respuestas de "cómo crear una esfera regular" ahora porque todo lo que tiene que hacer es hacer 6 planos y asegurarse de que los bordes de ellos se alineen (lo cual es trivial) y el resultado es:

Tendrás una bonita esfera con coordenadas fáciles de usar

Cualquier pregunta por favor comente, he intentado asumir poco conocimiento previo. También soy nuevo en la enseñanza de personas

Alec Teal
fuente
@Alec_Teal Estoy en tu respuesta desde que la publicaste, compleja y difícil de entender (no estoy acostumbrado a tantas fórmulas matemáticas) pero creo que tengo que entender ... ¿Es tu método realmente diferente de un cubo? esfera como se describe anteriormente? No entendí si sus "gráficos" son proyecciones cuadradas o algo más ...
Aracthor
@Aracthor es más general. Un gráfico es literalmente como un gráfico en un libro (de mapas) todo lo que hace es imponer una cuadrícula en alguna área. Digamos que tenía un toro, por ejemplo, o un toro de 2 agujeros, necesitaría estos métodos. Ninguna de las respuestas aquí trata las coordenadas en una esfera tanto como las formas regulares de crear la geometría, que es una tarea diferente. Puedo ayudar con las fórmulas, he intentado escribirlo lo más accesible posible, pero este es mi pan de cada día, así que no veo la complejidad.
Alec Teal
@Alec_Teal Lo he validado, pero sigo sin pensar que tengo todo. Pero continuemos esta discusión en una sala de chat .
Aracthor
12

Como ya ha demostrado, hay varias soluciones a este problema, pero ninguna es 100% ideal. Las esferas son complicadas.

Basado en cubo

Una ruta común, utilizada por Spore y probablemente en otros juegos (aunque es difícil saberlo con certeza sin mirar debajo del capó), es proyectar la esfera en un cubo y usar una cuadrícula cuadrada sobre cada cara del cubo.

(Esto es lo que Alec Teal y dnk drone.vs.drones están describiendo en los comentarios anteriores)

Esfera subdividida en base a un cubo

( Imagen de esta publicación que describe el uso de una representación cúbica para LoD )

Esto tiene muchas de las ventajas del método de latitud-longitud, con mucha menos distorsión de pico. Es fácil convertir de ida y vuelta entre las posiciones en la cuadrícula de la cara y las posiciones en la esfera, ya sea normalizando un vector o dividiéndolo por su componente más grande en valor absoluto. También se alinea muy bien con las técnicas de texturas de mapeo de cubos , que pueden ser útiles al ver todo el planeta desde la distancia.

El enfoque de mapeo típico se llama proyección gnomónica , y todavía tiene un problema de desajuste de densidad como puede ver en la imagen de arriba. La cuadrícula es mucho más densa cerca de las esquinas del cubo que en los centros de las caras. Si la uniformidad es importante, puede reducir esto con las fórmulas de mapeo correctas, pero esto generalmente hace que el mapeo sea más difícil de revertir.

Variando la función de mapeo para mejorar la uniformidad

En todos los casos, todavía tendrá una distorsión angular en las esquinas, donde una intersección de cuadrícula ordinaria de cuatro cuadrados con ángulos de 90 grados se convierte en una reunión de 3 rombos con ángulos de 120 grados.

A base de icosaedro

Mi enfoque favorito personal sería la versión icosaédrica que usted describió, porque hace que la distorsión angular máxima sea lo más pequeña posible. Donde la cuadrícula triangular normalmente tendría seis triángulos reunidos en ángulos de 60 grados, los vértices del icosaedro tienen 5 triángulos reunidos en ángulos de 72 grados. Entonces cada uno tiene menos distorsión que los cuadrados en el ejemplo del cubo.

No es un territorio tan familiar como los cuadrados de la versión del cubo, por lo que probablemente no sea tan popular. Se necesita un poco más de matemática para trabajar.

Sin embargo, identificar puntos cercanos no es tan complicado como podría parecer. Cualquier esfera geodésica basada en icosaedro se puede aplanar en una cuadrícula triangular regular:

Aplanar teselaciones geodésicas en una cuadrícula triangular regular Red de un icosaedro en una cuadrícula triangular

Y una cuadrícula triangular regular puede tratarse como una cuadrícula cuadrada, como se discute aquí .

Isomorfismo de cuadrícula triangular-cuadrada

Entonces, una vez que determina en qué cara del icosaedro se encuentra (lo que se puede hacer con un rayo contra una malla icosaédrica, no conozco ninguna forma matemática inteligente para simplificar esa parte), los alrededores se pueden completar utilizando Rejilla transversal. :)

Editar:

Si usa una geodésica de clase I, puede desenvolver sus planetas en cinco gráficos rectangulares para almacenar fragmentos de nivel / texturas / mapas de altura de manera eficiente, similar a los seis gráficos cuadrados que usaría para almacenar una versión basada en cubos:

Desenvolviendo una geosfera en cartas rectangulares

(Esto puede ayudar a abordar la preocupación planteada por Fuzzy Logic en otra respuesta. Esto también es posible pero un poco más complicado para las geodésicas de Clase II. No he investigado la Clase III)

El truco es que los ejes de estos gráficos no son realmente perpendiculares en uso, por lo que las herramientas / tecnología de autoría y transmisión existentes no lo admitirán de inmediato. Si de todos modos está planeando escribir su propia transmisión de fragmentos o utilizando la generación de procedimientos sobre la marcha, entonces eso podría no ser un problema. También podría solucionar el problema de autoría generando sus mapas de origen en una resolución más alta de la que necesita utilizando herramientas más convencionales, luego ejecutándolas a través de un proceso de horneado que muestrea a lo largo de la cuadrícula de gráficos para construir una representación densa y eficiente que se conecta directamente en la estructura icosaédrica.

DMGregory
fuente
1
Hay algunas cosas buenas aquí. Haría +1 pero planeo escribir una respuesta más tarde (trato de mantenerme fuera de las primeras fases de la votación cuando también respondo). Mis únicos comentarios serían que este enfoque es mejor para representar esferas que modelar la superficie
Alec Teal
Por si tienes curiosidad, ahora he terminado mi respuesta.
Alec Teal
4

La cuádruple esfera con LOD fragmentada es el método preferido si desea poder ir del espacio al suelo con cualquier nivel de terreno detallado, ya sea mapas de altura y texturas de procedimiento o predefinidos.

Icosasphere proporciona una malla más uniforme y es fácil de teselar, pero plantea problemas al intentar mapear texturas y mapas de altura que necesitará almacenar en caché y no será muy compacto o simple de esa manera.

La esfera cuádruple tiene puntos de pellizco, pero con suficiente mosaico no los verá de todos modos. Luego puede asignar texturas e implementar DLOD de manera efectiva como si cada región (fragmento) fuera una cuadrícula cuadrada con poco problema. Esto es más simple de implementar en comparación con una icosasfera y será más eficiente, tanto en computación como en recursos.

Vea los artículos de Sean O'Neil sobre cómo generar un universo procesal en Gamasutra:
- Parte 1 Perlin Noise y Fractal Brownian Motion para mapas de altura y texturas.
- Parte 2 Algoritmo de ROAM para malla de procedimiento con DLOD para la generación de planetas. Sufre de problemas de rendimiento. No recomendado pero bueno para el valor educativo.
- Parte 3 Aborda problemas con problemas de escala masiva, optimización y coma flotante. Principalmente relacionado con la escala del universo, pero también aplicable a los planetas cuando se realiza la transición de escalas de años luz a centímetros si lo desea.
- Parte 4 Discute la implementación de Quad -phere con DLOD fragmentado (quad-tree) para la generación de planetas <- vea este artículo en particular

Lógica difusa
fuente
0

No soy un experto en programación, pero podrías tener algún tipo de punto de control. Mientras pasa por un punto de control de seguridad, con animación, por supuesto, la superficie del planeta puede cargarse, y viceversa.

Aidan.W
fuente
Esto evita el problema al abrir la opción de no diseñar la superficie del planeta explorable como una esfera, pero no la resuelve.
Philipp