J'ai eu des problèmes pour trouver des informations sur les décalcomanies, alors peut-être que cette question aidera les autres. L'implémentation concerne un moteur de rendu direct.
Quelqu'un pourrait-il confirmer si j'ai bien appliqué la décalcomanie?
- Vous définissez un cube de n'importe quelle dimension qui définira le volume de projection dans l'espace commun. Vous vérifiez l'intersection du triangle avec le cube défini pour recevoir les triangles que la projection affectera.
- Vous coupez ces triangles et les enregistrez.
- Vous utilisez ensuite des astuces matricielles pour calculer les coordonnées UV des triangles enregistrés qui référenceront la texture que vous projetez.
- Pour ce faire, vous prenez les vecteurs représentant la hauteur, la largeur et la profondeur du cube dans l'espace commun, de sorte que le coin inférieur gauche soit l'origine.
- Vous mettez cela dans une matrice comme les vecteurs unitaires i, j, k, définissez la traduction pour le cube, puis vous inversez cette matrice.
- Vous multipliez les sommets des triangles enregistrés par cette matrice, de cette façon, vous obtenez leurs coordonnées à l'intérieur d'un cube de taille 0 à 1 que vous utilisez comme coordonnées UV.
- De cette façon, vous avez les triangles originaux sur lesquels vous projetez et vous avez des coordonnées UV pour eux (les coordonnées UV font référence à la texture que vous projetez).
- Ensuite, vous restituez les triangles enregistrés sur la scène et ils écrasent la zone de projection avec l'image projetée.
Maintenant, les questions pour lesquelles je n'ai pas pu trouver de réponses. Le dernier point est-il exact? Je n'ai jamais fait d'écrêtage logiciel, mais il semble suffisamment sujet aux erreurs, en raison de la précision limitée, que des combats z se produiront pour la texture projetée. La manière d'obtenir les coordonnées UV est-elle également correcte?
Réponses:
Jetez un œil à cet article:
http://blog.wolfire.com/2009/06/how-to-project-decals/
Il semble qu'il utilise exactement la même approche que vous utilisez. Il ne parle pas de combats z, mais cela pourrait certainement devenir un problème à de plus grandes distances.
Ma suggestion serait de désactiver les décalcomanies après une certaine distance si les combats z deviennent très visibles.
la source
Ce que j'ai fait pour résoudre les combats en Z, c'était de bousculer légèrement la valeur Z du sommet, dans mon shader de décalcomanie, après qu'il soit en coordonnées d'écran.
OK ..... J'utilise des décalcomanies ajustées. Je crée un maillage nxn avec Y assis sur le terrain. J'utilise du code pour trouver le Y sur le maillage polygonal des terrains. Après tous les transfroms, je dessine par-dessus la géométrie existante en coordonnées d'écran. Le tampon de profondeur est en coordonnées d'écran, donc en déplaçant légèrement le Z des polygones de décalcomanies vers l'écran, il arrête le combat contre le Z. En faisant cela, j'ai réduit de moitié le nombre de polygones constituant mes mailles de décalcomanies ajustées. C'est l'ancien code 120
J'espère que cela explique mieux .. (comme demandé)
la source