Como converter coordenadas do mouse em índices isométricos?

21

Eu desenho um mapa isométrico com bloco 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);
  }

Imagem, ilustrando este código:

Imagem, ilustrando este código:

Caros profissionais, por favor, ajudem com uma fórmula de transformação de coordenadas de mouse em índices isométricos de uma célula. Exemplo: (105; 100) -> [1; 4]

Alexan-Dwer
fonte
possível duplicata da renderização isométrica e da separação?
bummzack
Nota lateral: se você realmente não deseja acessar o valor anterior de uma variável que está incrementando, como em while(val = arr[i++])construções semelhantes ou similares, não a use . Use ++ae em ++bvez disso.
Martin Sojka

Respostas:

25

Você precisa determinar a matriz de transformação de coordenadas de espaço em mosaico em coordenadas de espaço de tela e, em seguida, calcular a matriz inversa para isso, que quando aplicada às coordenadas de espaço em tela as transforma em coordenadas de espaço em mosaico.

A propósito: seu deslocamento está realmente apontando para um local que seria (0,0, 1,0) em qualquer sistema de coordenadas sãs, mas isso não é um grande problema, apenas algo a ser lembrado. Isso significa que o deslocamento da origem do sistema de coordenadas transformado está em (Offset + 32, 0).


Caso específico

O que você está basicamente fazendo para transformar as coordenadas do espaço do bloco (a, b) em coordenadas do espaço da tela (x, y) é executá-lo através da seguinte matriz de transformação:

insira a descrição da imagem aqui

Definições: um e b para o ladrilho (0, 0) estão no intervalo [0.0, 1.0) com (0.0, 0.0), sendo o canto superior, (1.0, 1.0) no canto inferior, (0.0, 1.0) o canto esquerdo e (1,0, 0,0) o canto direito no espaço da tela.

Nós estendemos as definições de coordenadas por uma terceira coordenada constante (é sempre exatamente 1) para poder incorporar a tradução na matriz.

Agora você pode criar a matriz inversa para essa transformação. A fórmula básica é:

insira a descrição da imagem aqui

... com C sendo a matriz de co-factores para uma .

No seu caso, o determinante | Um | é sempre 1024, independentemente do deslocamento, portanto, a matriz inversa é:

insira a descrição da imagem aqui


Exemplo de cálculo

Agora, para seus dados de exemplo ...

Coloque seu número para deslocamento na fórmula e você obtém:

insira a descrição da imagem aqui

Multiplicar (105, 100, 1) (as coordenadas da tela) com a matriz permite:

insira a descrição da imagem aqui insira a descrição da imagem aqui

Como a terceira coordenada é sempre 1, não precisamos calculá-la. Arredonde para o número inteiro mais próximo e você obtém (1, 4) as coordenadas do espaço do bloco, conforme o esperado.


Matrizes de projeção dimétrica geral

Se você tiver uma perspectiva como essa, com cada ladrilho com 2 w de largura (64 no exemplo, então w = 32) e 2 h de altura (32 no exemplo, então h = 16) e o deslocamento do ponto de origem no espaço de tela ser f x e f y para o eixo horizontal e vertical, respectivamente, (192 e 0 no exemplo), as matrizes de olhar como se segue.

Espaço em bloco para o espaço da tela

insira a descrição da imagem aqui

Espaço da tela para o espaço lado a lado

insira a descrição da imagem aqui

Martin Sojka
fonte