Como posso determinar o primeiro bloco visível em uma perspectiva isométrica?

7

Estou tentando renderizar a parte visível de um mapa isométrico em forma de diamante. O sistema de coordenadas "mundo" é um sistema cartesiano 2D, com as coordenadas aumentando na diagonal (em termos do sistema de coordenadas da vista) ao longo dos eixos. As coordenadas da "visualização" são simplesmente deslocamentos do mouse em relação ao canto superior esquerdo da visualização.

insira a descrição da imagem aqui

Meu algoritmo de renderização funciona desenhando vãos diagonais, começando no canto superior direito da vista e movendo-se na diagonal para a direita e para baixo, avançando para a próxima linha quando atingir a borda direita da vista. Quando o loop de renderização atinge o canto inferior esquerdo, ele para.

Existem funções para converter um ponto das coordenadas da vista em coordenadas do mundo e depois mapear as coordenadas.

Tudo funciona ao renderizar a partir do bloco 0,0, mas à medida que a exibição rola ao redor da renderização, é necessário iniciar de um bloco diferente. Não consigo descobrir como determinar qual bloco está mais próximo do canto superior direito.

No momento, estou simplesmente convertendo as coordenadas do canto superior direito para mapear as coordenadas. Isso funciona desde que a origem da visualização (canto superior direito) esteja dentro do mundo, mas ao se aproximar das bordas do mapa, as coordenadas iniciais do bloco obviamente se tornam inválidas.

Acho que isso se resume a perguntar "como posso encontrar a interseção entre o eixo X do mundo e o eixo X da vista?"

alekop
fonte
dando uma representação pictórica do problema realmente vale ... você pode fazer isso por favor?
Ayyappa 11/11
Você já tentou resolvê-lo com fórmulas em Projeção Isométrica no wiki ?
user712092
@ user712092: Sim, estou usando uma matriz 4x4 para transformar entre o espaço de visualização e o espaço do mundo. Isso funciona, mas o problema é como calcular as coordenadas x, y para o bloco mais próximo da borda superior direita da visualização.
Alekop # 13/11
@ Homem com nervos de aço: eu publicaria uma captura de tela, mas SO não me deixaria por causa da minha baixa reputação. Mas imagine um grande diamante recortado dentro de um retângulo menor.
Alekop #
a) Carregue a imagem no site de hospedagem de imagens e insira seu URL lá. b) Vários URLs de imagem podem estar em um único URL de pasta . c) Insira o link textual "O texto está ativado no pastebin com o sufixo Lxzygtv9". Você pode essa imagem mais tarde; ou alguém que possa adicionar imagens agora (parece que tenho o direito de editar e inserir imagens).
user712092

Respostas:

1

mas ao se aproximar das bordas do mapa, a coordenada inicial do bloco obviamente se torna inválida.

Na verdade, você pode não ter dados para o local, mas não deve haver nada de errado em usar a mesma fórmula.

Se você deseja sugestões de como superar os possíveis problemas, pode nos mostrar o trecho de código apropriado.

Edit:
Apenas para esclarecer, digamos que você tenha um mapa de blocos de 100x100, indexado de 0 a 99. Para renderizar, você faria algo assim:

//Loop structure that iterate through tiles
    if(tileX<=99 && tileX>=0 && tileY<=99 && tileY>=0){
        //Draw the tile
    }
    else{
        //Do nothing
    }
//End of loop
aaaaaaaaaaaa
fonte
Essa é uma boa ideia. Eu poderia simplesmente fazer continueo loop de renderização até que o bloco atual esteja dentro do mapa e da visualização. Vou tentar assim que encontrar algum tempo! :)
alekop