¿Cómo convertir las coordenadas del mouse en índices isométricos?

21

Dibujo un mapa isométrico con el mosaico 64x32 :

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

Imagen, que ilustra este código:

Imagen, que ilustra este código:

Estimados profesionales, por favor, ayuden con una fórmula de transformación de coordenadas de ratón en índices isométricos de una célula. Ejemplo: (105; 100) -> [1; 4].

Alexan-Dwer
fuente
posible duplicado de renderizado isométrico y picking?
bummzack
Nota al margen: si en realidad no desea acceder al valor anterior de una variable que está incrementando, como en while(val = arr[i++])construcciones similares, no lo use . Uso ++ay en su ++blugar.
Martin Sojka

Respuestas:

25

Debe determinar la matriz de transformación de las coordenadas del espacio de mosaico a las coordenadas del espacio de pantalla, luego calcular la matriz inversa para esto, que cuando se aplica a las coordenadas del espacio de pantalla las transforma a las del espacio de mosaico.

Por cierto: su desplazamiento en realidad apunta a un lugar que sería (0.0, 1.0) en cualquier sistema de coordenadas sensato, pero ese no es un gran problema, solo algo a tener en cuenta. Esto significa que el desplazamiento del origen de su sistema de coordenadas transformado está en (Offset + 32, 0).


Caso específico

Lo que básicamente está haciendo para transformar las coordenadas del espacio de mosaico (a, b) en coordenadas del espacio de pantalla (x, y) es ejecutarlo a través de la siguiente matriz de transformación:

ingrese la descripción de la imagen aquí

Definiciones: un y b para la baldosa (0, 0) están en el intervalo [0,0, 1,0) con (0.0, 0.0) que es la esquina superior, (1.0, 1.0) de la esquina inferior, (0.0, 1.0) la esquina izquierda y (1.0, 0.0) la esquina derecha en el espacio de la pantalla.

Extendemos las definiciones de coordenadas por una tercera coordenada constante (siempre es exactamente 1) para poder incorporar la traducción en la matriz.

Ahora puede crear la matriz inversa para esta transformación. La fórmula básica es:

ingrese la descripción de la imagen aquí

... con C siendo la matriz de cofactores para A .

En su caso, el determinante | A | siempre es 1024, sin importar el desplazamiento, por lo que la matriz inversa es:

ingrese la descripción de la imagen aquí


Ejemplo de cálculo

Ahora, para sus datos de ejemplo ...

Ponga su número de compensación en la fórmula, y obtendrá:

ingrese la descripción de la imagen aquí

Multiplicar (105, 100, 1) (las coordenadas de la pantalla) con la matriz te da:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Como la tercera coordenada siempre es 1, no tenemos que calcularla. Redondea hacia abajo al número entero más cercano, y obtienes (1, 4) como tus coordenadas de espacio de mosaico, como se esperaba.


Matrices de proyección dimetrica general

Si tiene una perspectiva como esta con cada mosaico de 2 w de ancho (64 en el ejemplo, entonces w = 32) y 2 h de altura (32 en el ejemplo, entonces h = 16), y el desplazamiento del punto de origen en el espacio de pantalla siendo f x y f y para el eje horizontal y vertical respectivamente (192 y 0 en el ejemplo), las matrices se ven a continuación.

Espacio de mosaico a espacio de pantalla

ingrese la descripción de la imagen aquí

Espacio de pantalla a espacio de mosaico

ingrese la descripción de la imagen aquí

Martin Sojka
fuente