¿Representación isométrica y picking?

23

He estado buscando una fórmula para trazar mosaicos isométricos (mundo-> pantalla) y selección del ratón (mundo-> pantalla) en un mundo con forma de diamante. Las que he probado siempre parecen estar, bueno, apagadas. ¿Cuál es la forma habitual / correcta de hacer esto?

mpnk121
fuente
El método y la fórmula exactos utilizados dependen un poco de la forma de sus mosaicos, y probablemente un poco de cómo está dibujando el mapa (es 0,0 en la parte superior, inferior o uno de los lados del mapa) Más detalles sobre su problema ayudaría.
Thedaian
1
Los mosaicos son 2: 1 (más específicamente, 64x32). El sistema de coordenadas no importa ya que estoy escribiendo el editor. (0,0 en la parte superior o izquierda parece razonable sin embargo.)
mpnk121
Muy tarde a la pregunta y ni siquiera tengo una respuesta completa, pero hubo una muy buena charla de Google Tech sobre este tema preciso. Su configuración incluye elegir la porción no transparente de imágenes arbitrarias (en javascript, nada menos). youtube.com/watch?v=_RRnyChxijA
Seth Battin

Respuestas:

21

Según su comentario, aquí está el código que estoy usando para convertir los valores de mosaico x, y en coordenadas de pantalla. Ahora, no tiene en cuenta las "fichas 3D", todo se considera que está en el mismo plano, por lo que si está escribiendo un juego donde eso importa, este código no funcionará.

//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
        point screen;
        //calculate the screen coordinates
        //note: these will then be modified by the camera
        screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
        screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
        return screen;
 }

El punto es simplemente una estructura que contiene entradas x e y, TILE_WIDTH sería 64 en su caso, TILE_DEPTH está mal nombrado (en realidad es la altura de los gráficos de mosaico), pero sería 32 en su caso. Los desplazamientos son si desea que su mapa de mosaicos "comience" en una ubicación x, y diferente (como si desea que los mosaicos estén por encima de otro conjunto de mosaicos). Típicamente el desplazamiento puede ser 0,0.

Esto generará un mapa con 0,0 en la parte superior, en el medio, así:

        0,0
    0,1     1,0
0,2     1,1     2,1

En cuanto a encontrar el mosaico x, y del cursor:

point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;

En este fragmento de código, mX y mY son las coordenadas de la pantalla del mouse, que estamos combinando con los valores de la cámara para averiguar dónde estamos en las "coordenadas mundiales". Todo lo demás es igual que el ejemplo de código anterior.

Una vez más, esto supone un plano plano de mosaico isométrico 2D. Hay algún trabajo adicional si desea utilizar una vista semi-3d del mapa, y todo esto supone que está trabajando en 2d de todos modos.

thedaian
fuente
1
¡Gracias! - Esto funciona muy bien para mapas planos. Ahora, ¿puede contarme un poco más sobre cómo podría agregar mosaicos de tamaño arbitrario (es decir, con una profundidad Z) que están en otra capa? (Como accesorios como un pozo o una farola)
mpnk121
2
Ahí es cuando usas los valores offsetY y offsetX. Si su farola es de 64x64, entonces pasar un negativo 32 por el valor offsetY debería hacer que aparezca en el lugar correcto. Esperemos que sea suficiente para comenzar.
Thedaian
66
¿No debería la coordenada "2,1" en su ejemplo ser un "2,0"?
Chris