La cuestión de la precisión
Desde el principio, el equipo de ingeniería sabía que el mundo continuo iba a afectar significativamente el diseño del motor y el contenido, y el problema central era la estabilidad numérica. Imagina dos personajes caminando en formación a dos metros de distancia en dirección este, lejos del origen. En algún momento, la distancia entre ellos se ve abrumada por la distancia desde el origen, y los personajes parecerán estar "en el mismo lugar".
Con coma flotante, cuanto más se aleje del origen, más precisión perderá, lo que puede causar todo tipo de problemas desagradables. Las cosas no se arreglan bien, aparecen grietas entre mallas adyacentes, el espacio comienza a cuantificarse y los gatos y los perros comienzan a vivir juntos. Dungeon Siege usa la FPU en modo de precisión simple para obtener los obvios beneficios de rendimiento y para igualar la precisión nativa del hardware de video. Sin embargo, incluso si aumentamos la precisión, en última instancia, nunca podría resolver el problema porque se planeó que el mundo fuera increíblemente grande.
El problema de precisión significaba que no sería posible tener un espacio mundial coordinado unificado como la mayoría de los otros juegos. En cambio, la solución fue segmentar el mundo continuo en un conjunto de espacios de coordenadas independientes y alternar entre ellos periódicamente para restablecer la precisión. Se probaron varias ideas dentro de estas limitaciones, y finalmente nos decidimos por una variación de un sistema de portal estándar.
Nuestra solución consiste en un sistema de coordenadas basado en nodos relacionales, en el que cada fragmento de geometría (Nodo de asedio) tiene su propio espacio de coordenadas, y está vinculado espacialmente a la geometría vecina a través de las puertas que comparte en común con esos vecinos. La disposición de los nodos conectados por puertas forma un gráfico continuo que representa todo el mapa mundial. Este sistema de nodos evolucionó con el tiempo desde su objetivo original de mantener la precisión de la FPU para convertirse en el método principal de subdividir el espacio de manera eficiente y la raíz de innumerables optimizaciones.
Para encapsular el concepto de una posición 3D con respecto a un nodo específico, el vector tradicional (x, y, z) tuvo que ser aumentado con una ID de nodo (x, y, z, nodo) y representar un desplazamiento desde el origen de un nodo específico en su lugar. Esta 4-tupla está encapsulada como una Posición de Nodo de Asedio, o SiegePos. Más tarde, agregamos un SiegeRot (quaternion, nodo) para manejar las comparaciones entre orientaciones entre nodos.
La frase "no hay espacio mundial" se convirtió en un mantra para el equipo, aunque literalmente les tomó años a todos entender lo que significaba.
Para un mundo enorme sin zonas, optaría por un vértice de doble precisión o un punto flotante con trozos más pequeños que dividen la tierra.
Cada fragmento tendría su propio sistema de coordenadas. Cuando cruzas el borde a cada uno de estos fragmentos, transformas todo a ese sistema de coordenadas. Así es como lo hacen en simuladores de vuelo de todos modos.
Si tienes zonas pequeñas, supongo que flotar será suficiente.
fuente
Yo diría que para la ubicación real es un vector de 3 flotadores. Pero también habría un índice de zona asociado con el jugador también. (Pero no es parte de la ubicación porque todo lo que maneja ese servidor de zona está en la misma zona y, por lo tanto, no necesita estar en la misma estructura de datos).
Recuerde que hay al menos 4 zonas. Los 4 continentes principales. No creo que ninguno de esos tenga más de 10 km de lado. Por ejemplo, este blog previo a la última expansión calcula el área total de viaje como 41 millas cuadradas. Todos los campos de batalla, todas las instancias, están dentro de su propia zona y espacio de coordenadas también.
Usando la API LUA puede obtener la posición del jugador GetPlayerMapPosition () devuelve dos flotantes cada uno de 0 a 1 como una proporción a lo largo de todo el mapa mundial.
fuente
Para WoW, espero que usen un flotador simple x / y / z, pero en relación con una 'zona' específica
Esto ayudaría a manejar 'zonas móviles', por ejemplo, botes y zepelines
fuente
Por lo general, juegos en línea como Wow, Tibia, etc. Guarde la posición del jugador. usando tres variables X + Y + Z en la metatabla del jugador SQl. Runescape lo hace sin la Z, de esa manera el jugador siempre se representa en la parte superior de la malla del suelo.
fuente
Un flotador? Bueno, una serie de 3 carrozas para un juego en 3D. Al menos para nosotros usamos pies como unidades, por lo que todo lo que necesita es 3-4 decimales para estar en el punto en que el ruido de flotación no sea un problema. Si una zona grande tiene solo una o dos millas de lado, no es tan importante. En cuanto a la zonificación transparente en los MMO, esa es una pregunta completamente diferente. En el gran esquema de problemas difíciles en un MMO, la posición de almacenamiento es bastante baja en la lista.
fuente