Como determino a ordem do sorteio em um jogo flash com vista isométrica?


12

Isto é para um jogo em flash, com vista isométrica. Eu preciso saber como classificar o objeto para que não haja necessidade de verificação do z-buffer ao desenhar. Isso pode parecer fácil, mas há outra restrição: uma cena pode ter mais de 10.000 objetos; portanto, o algoritmo precisa ser executado em menos de O (n ^ 2). Todos os objetos são caixas retangulares e há 3-4 objetos em movimento na cena. Qual é a melhor forma de fazer isso?

ATUALIZAR

em cada bloco há apenas objeto (quero dizer, objetos não podem ser empilhados uns sobre os outros). e acessamos o mapa de objetos e os objetos têm sua própria posição.

UPDATE2

veja estas figuras:

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

no primeiro, um primeiro objeto azul deve ser desenhado, depois verde e vermelho. enquanto no segundo você precisa desenhá-los em ordem inversa. você precisa desenhar primeiro o vermelho e depois o objeto verde e finalmente azul. Como você pode ver, não há diferença na posição dos objetos azuis e vermelhos, ambos têm distâncias diferentes da câmera e assim por diante. mas devido à sua posição relativa em relação à caixa verde, é necessário alterar a ordem dos desenhos entre duas imagens. é isso que torna esse problema uma bagunça.

nota lateral: como todos os objetos são prisma retangular, é matematicamente comprovável que exista pelo menos uma ordem de desenho para atender às necessidades do problema.


2
Você deve postar mais informações. Os objetos podem empilhar (3d)? Objetos têm posições ou o mapa possui objetos? etc
kaoD 21/03


@ Tetrad, sim, mas há uma pequena diferença nos objetos que colocamos em cena.
Ali1S232

Os objetos @Gajet (após a atualização) podem ser apenas 1 * X e X * 1 ou também X * Y? Você poderia dividir os objetos em vários subobjetos? (como o verde sendo 4 objetos sub-verdes) A ​​orientação do objeto é fixa?
KaoD 22/03/12

Além disso: quantos blocos adjacentes a altura do seu objeto obscurece?
KaoD 22/03/12

Respostas:


8

Isso é realmente muito simples se seus objetos combinarem com seus blocos isométricos. Veja esta imagem:

Ordem de desenho isométrica

Você deve primeiro desenhar o objeto na posição vermelha, depois objetos em azul, depois verde, depois amarelo, depois magenta e assim por diante ... Deveria ser bastante óbvio como implementar isso se o seu quadro contiver objetos em vez de objetos tendo posição como um atributo. Se esse não for o seu caso, você deve manter uma estrutura de dados separada, atualizando-a sempre que um objeto se mover (o que também deve ser bastante fácil).

Isso tem um novo problema: você pode ver facilmente como agora sua complexidade é O (N) onde N é o tamanho da sua placa ( N=W*H). Para superar esse problema, basta criar uma nova estrutura de dados linear em que cada índice em sua estrutura corresponda a uma determinada profundidade, atualizando-a sempre que um objeto alterar a profundidade.

O caso em que um objeto não corresponde a um único bloco é um pouco mais difícil, portanto, publicarei se você precisar assim que atualizar sua pergunta.


esse algoritmo também é o primeiro que me veio à cabeça, mas veja minha atualização, é por isso que você não pode usá-lo sem uma alteração.
Ali1S232

1
@ Gajet e esse é o tipo de coisa que você deve postar em sua pergunta: P
kaoD

3
Este é o caminho a seguir, divida as partes grandes em 'tiles' +1
Valmond 22/03

2

Não tenho nenhum conhecimento especial sobre esse assunto, mas aqui está um pensamento.

Comece marcando cada célula como "não desenhada". (Ou, de maneira equivalente, use uma matriz para representar a localização da coisa "desenhada" mais próxima em cada "linha mais próxima" de células, ou um conjunto etc.) Em seguida, para cada célula (eu provavelmente as examinaria em a ordem kaoD descrita): verifique se a célula foi desenhada; se não foi desenhado e contém um objeto, verifique se cada célula que seria obscurecida por esse objeto foi desenhada e, se não, desenhe-a recursivamente; desenhe o objeto contido nessa célula, se necessário; e marque essa célula e quaisquer células ocupadas por seu objeto como "desenhadas".

Suponho que você possa mapear rapidamente uma célula para o objeto dentro dela, se houver. Acredito que este é o tempo de O (n), embora possa acabar criando uma pilha grande (que você pode querer transformar em uma lista vinculada, se estiver preocupado com a falta de espaço na pilha).

Se você realmente precisa de uma lista, pode anexá-la a uma lista em vez de desenhar. Suspeito que começar com uma lista classificada principalmente não ajude.


Eu acredito que esse algoritmo pode ser visto como uma forma de classificação topológica adaptada ao problema; Eu estava prestes a apontar vagamente nessa direção. A classificação topológica é uma solução para a maioria dos problemas de pedido / dependência.
Kevin Reid

1

Eu usaria o algoritmo do pintor a uma distância de táxi da célula mais distante da câmera, desenhando primeiro os mais próximos da câmera e depois movendo-os para fora.

Editar: isso não funciona, a menos que você possa desenhar o conteúdo de cada célula individualmente.


isso pode funcionar, mas não sei dizer como ele difere dos algoritmos sugeridos por byte56 ou kaoD. para mim, parece que ainda tem os mesmos problemas descritos na minha segunda edição.
Ali1S232

1

O que faz você acreditar que é "matematicamente comprovável que exista pelo menos uma ordem de empate para satisfazer as necessidades do problema"? Aqui está um contra-exemplo trivial em que você não pode confiar em objetos de classificação z:

insira a descrição da imagem aqui


Só por curiosidade ... você poderia elaborar o contra-exemplo? Isso não é uma grade.
kaoD

observe que há apenas um objeto em cada peça e o objeto pode ocupar uma ou mais peças, mas elas sempre têm projeção retangular no plano. essas duas condições são suficientes para provar essa afirmação.
Ali1S232

Ok, com essas restrições e o fato de a grade ser plana, existe uma solução. Vou publicá-lo mais tarde.
sam hocevar 23/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.