Desplazamiento sin fin por un map 3d

Tengo algo de experiencia con Metal y bastante con Unity y estoy familiarizado con la configuration de mallas, memorys intermedias y los datos de respaldo para dibujar; pero no tanto el lado matemático / sombreador. Lo que estoy luchando es cómo get un mundo de desplazamiento sin fin. Entonces, si avanzo hacia el lado derecho, puedo ver el lado izquierdo y seguir adelante.

La aplicación de esto sería un terreno sin costuras que un jugador podría desplazarse en cualquier dirección para siempre y tenerlo simplemente envuelto.

No quiero duplicar todo en dibujar y compensarlo, eso parece terriblemente ineficiente. Espero una manera de usar algunas matrices de matrices mágicas o algún tipo de sombreado para lograr que las cosas se envuelvan / dibujen donde deberían cuando panoramizan el map. He buscado por todos lados algún tipo de guía o explicación sobre cómo hacer funcionar esto, pero no he encontrado nada.

Sé que muchos juegos antiguos (dos) lo hicieron de alguna manera, ¿es posible? ¿Hay alguna razón por la que parece que la industria ha migrado lejos de este tipo de desplazamiento (límite a bordes vs envoltura)?

He creado un ejemplo simple que demuestra lo que estás buscando (creo).

La idea básica es dibujar el map en una cuadrícula repetitiva, utilizando el drawPrimitives(type:vertexStart:vertexCount:instanceCount:) en MTLRenderCommandEncoder . Como el recuento de instancias, desea pasar el número de maps idénticos que desea dibujar, extendiéndolo tanto como sea necesario para no ver dónde termina. En mi ejemplo, usé una cuadrícula simple de 5×5.

Para que el usuario no vea el borde del map, vamos a calcular su position module 1 (o el tamaño que sea su map):

 func didDrag(dx: CGFloat, dy: CGFloat) { // Move user position on drag, adding 1 to not get below 0 x += Float(dx) * draggingSpeed + 1 z += Float(dy) * draggingSpeed + 1 x.formTruncatingRemainder(dividingBy: 1) z.formTruncatingRemainder(dividingBy: 1) } 

Así es como se ve:

Solo un seguimiento de lo que realmente implementé. Primero, básicamente, tengo una matriz de puntos x, y con altitud, tipo de terreno y todo ese jazz. Usando un % simple y adiciones / sustracciones es trivial get los nodos alnetworkingedor de un punto para generar triangularjs

En un sorteo, calculo el primer punto de muestra y el último punto de muestra y calcula los grupos de triangularjs que se muestran entre esos puntos. El primer / último punto tiene en count el envoltorio, entonces es bastante trivial tener un mundo de envoltorio sin fin. Para cada grupo se pasa un desplazamiento de traducción a través de una matriz uniforme para ese grupo que colocará esa sección a la que debería pertenecer.

Lo configuré vía renderEncoder.setVertexBytes(&uniform, length:..., offset:...)