C'est pour un jeu flash, avec vue isométrique. J'ai besoin de savoir comment trier un objet pour qu'il n'y ait pas besoin de vérifier le z-buffer lors du dessin. Cela peut sembler facile, mais il y a une autre restriction, une scène peut avoir plus de 10 000 objets, donc l'algorithme doit être exécuté en moins de O (n ^ 2). Tous les objets sont des boîtes rectangulaires et 3-4 objets se déplacent dans la scène. Quelle est la meilleure façon de procéder?
MISE À JOUR
dans chaque tuile, il n'y a qu'un objet (je veux dire que les objets ne peuvent pas s'empiler les uns sur les autres). et nous accédons à la fois à la carte des objets et les objets ont leur propre position.
UPDATE2
voir ces chiffres:
dans le premier un premier objet bleu doit être dessiné puis vert puis rouge. tandis que dans le second, vous devez les dessiner dans l'ordre inverse. vous devez d'abord dessiner un objet rouge, puis vert et enfin bleu. comme vous pouvez le voir, il n'y a pas de différence de position entre les objets bleus et rouges, ils ont tous deux une distance différente de la caméra, etc. mais en raison de leur position relative par rapport à la boîte verte, vous devez modifier leur ordre de dessin entre deux images. c'est ce qui fait de ce problème un gâchis.
note latérale: puisque tous les objets sont des prismes rectangulaires, il est mathématiquement prouvable qu'il existe au moins un ordre de dessin pour satisfaire les besoins du problème.
la source
Réponses:
C'est en fait très simple si vos objets correspondent à vos carreaux isométriques. Jetez un oeil à cette image:
Vous devez d'abord dessiner l'objet en position rouge, puis les objets en bleu, puis en vert, puis en jaune, puis en magenta, etc. ayant la position comme attribut. Si ce n'est pas votre cas, vous devez conserver une structure de données distincte, la mettre à jour chaque fois qu'un objet se déplace (ce qui devrait également être assez facile.)
Cela a un nouveau problème: vous pouvez facilement voir comment maintenant sa complexité est O (N) où N est la taille de votre carte (
N=W*H
). Pour surmonter ce problème, créez simplement une nouvelle structure de données linéaire où chaque index de votre structure correspond à une profondeur donnée, en la mettant à jour chaque fois qu'un objet change de profondeur.Le cas où un objet ne correspond pas à une seule tuile est un peu plus difficile, donc je le posterai si vous en avez besoin dès que vous mettez à jour votre question.
la source
Je n'ai aucune connaissance particulière à ce sujet, mais voici une pensée.
Commencez par marquer chaque cellule comme "non dessinée". (Ou, de manière équivalente, utilisez un tableau pour représenter l'emplacement de la chose "dessinée" la plus proche sur chaque "ligne presque éloignée" de cellules, ou un ensemble, etc.) Ensuite, pour chaque cellule (je les parcourrais probablement dans l'ordre décrit par kaoD): vérifiez si cette cellule a été dessinée; s'il n'a pas été dessiné et contient un objet, vérifiez si chaque cellule qui serait obscurcie par cet objet a été dessinée et sinon dessinez-la récursivement; dessinez l'objet contenu par cette cellule si nécessaire; et marquez cette cellule et toutes les cellules occupées par son objet comme "dessinées".
Je suppose que vous pouvez rapidement mapper une cellule à l'objet à l'intérieur, le cas échéant. Je crois que c'est le temps O (n), bien qu'il puisse finir par construire une grande pile (que vous voudrez peut-être transformer en une liste liée si vous craignez de manquer d'espace de pile).
Si vous avez vraiment besoin d'une liste, vous pouvez l'ajouter à une liste au lieu de la dessiner. Je soupçonne que commencer avec une liste principalement triée n'aide pas.
la source
J'utiliserais l'algorithme du peintre avec une distance en taxi de la cellule la plus éloignée de la caméra, en dessinant d'abord celles qui sont les plus proches de la caméra, puis en se déplaçant vers l'extérieur.
Modifier: cela ne fonctionne que si vous pouvez dessiner le contenu de chaque cellule individuellement.
la source
Qu'est-ce qui vous fait croire qu'il est «mathématiquement prouvable qu'il existe au moins un ordre de tirage pour répondre aux besoins du problème»? Voici un contre-exemple trivial où vous ne pouvez pas vous fier aux objets de tri z:
la source