[RESOLU] Caméra et ordre dans les calques

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Avatar de l’utilisateur
Zephyr Märchenwald
Messages : 8
Inscription : 16 Avr 2019 19:09

[RESOLU] Caméra et ordre dans les calques

Message par Zephyr Märchenwald » 16 Avr 2019 21:33

Attention : Pavay César :ange:

Bonjour, bonsoir à tous !

Comme je l'ai spécifié dans mon topic de présentation, ma venue sur Unity (ayant délaissé Game Maker) est due à un besoin de liberté. Le boulot est certes moins assisté, mais au moins, c'est pas limité ! :merci:
Mon projet en question est un jeu 2D en vue de 3/4 (La vue est orientée à 45°. C'est comme si la vue de dessus avait passé une nuit à l’hôtel avec un side scroller. Elle accoucherait probablement de la vue de 3/4). Pour les connaisseurs, Alundra est le meilleur exemple qui me vienne en tête ! On peut aussi citer les premiers Zelda en 2D même s'ils trichent un peu sur la perspective car combinent des éléments de la vue de 3/4 ET de la vue de dessus.

Là où ça devient intéressant, c'est que ce type de vue permet d'établir une notion de hauteur en gardant une bonne cohérence visuelle. Ben oui, faire varier un axe Z en vue de dessus, c'est pas ce qu'il y a de plus évident à se représenter...
L'intérêt est principalement de pouvoir inclure des phases de plateforme (qui étaient jusque là surtout réservées aux side scrollers).

Le principal problème auquel on se heurte lors de la mise en place d'un univers en vue de 3/4 est la manière de rendre les calques : le fameux sorting layer (Même si là, il n'est pas seulement question de calques). Dans un jeu en vue de dessus, c'est pas bien compliqué. On admet simplement que les sprites ne sont pas plats et on utilise le bon vieux depth = y. Dans l'absolu, même pas besoin d'utiliser de calques pour ce cas de figure.
Mais, avec une dimension en plus, comment qu'on fait ? À moins qu'un génie parmi vous me donne une solution (autre que celle que je vais avancer) je pense que ça devient rapidement ingérable... :berk1:

Du coup, voici ce que j'ai utilisé : - LA TRICHE -
Je travaille dans un environnement 3D en disposant les éléments de telle sorte à ce que les gens se disent "Mais oui ! C'est totalement de la 2D ! :cote:". Bon, bien entendu, je n'utilise pas de modèles 3D (De toute façon, j'en serais tout bonnement incapable), les sprites restent en 2D mais évoluent dans un environnement 3D.
Pour garder une cohérence dans les proportions, les sprites "non-horizontaux" sont inclinés à 45° et étirés selon leur hauteur (un peu de trigo et le tour est joué ! Faîtes-moi signe si vous voulez jeter un œil au script).

Le problème, c'est que le résultat que j'obtiens est AFFREUX ! Un sprite a beau être devant un autre, la caméra s'entête à me le placer derrière... :rougefaché:
Voici un rapide aperçu de ce qui se passe :
1.png
Vue 3D de la scène
1.png (41.14 Kio) Consulté 4861 fois
Ici, le carré blanc représente le niveau +1. Le carré noir est un mur posé sur le niveau 0 (incliné à 45°) et le rond gris, c'est le "joueur" (c'est un test hein. On juge pas les graphismes !) lui aussi incliné.
Sur cette image de la Scène, on voit clairement que le rond gris est devant le mur noir.
Pourtant, voilà ce que j'obtiens in game :
2.png
Vue 2D en projection Orthographique
2.png (4.68 Kio) Consulté 4861 fois
Le rond gris est complètement derrière le mur noir... Et ça n'a strictement aucun sens.
Il est fort possible que je ne comprenne pas exactement comment fonctionne la caméra d'Unity. De ce que j'ai cru comprendre, la camera rend les objects qui sont dans son champ de vision en calculant la distance qui les sépare. Même si, sur l'axe Z le rond et le carré sont à la même distance, sur l'axe Y, le rond est clairement plus proche de la caméra que le carré ! Alors, pourquoi ce résultat ?

J'ai tenté de passer ma caméra en mode perspective. Là, étonnement, ça fonctionne déjà beaucoup mieux ! (Attention, tout n'est pas rose non plus... Il y a quelques imprécisions. Il suffit que le rond bouge un peu sur l'axe X pour complètement changer de plan. D'ailleurs, je ne m'explique absolument pas ce dernier point...)
Le problème, c'est qu'en projection perspective, les sprites sont déformés et le subterfuge ne fonctionne plus... Ainsi, j'aimerais vraiment pouvoir rester en projection orthographique. Mais, tout ça a au moins eu le mérite de prouver que tout n'est pas forcément perdu. M'enfin... Je suppose...?
Au passage, voici le résultat dans ce mode de projection :
3.png
Vue 2D en projection Perspective
3.png (5.87 Kio) Consulté 4861 fois
Le plus troublant, c'est que la technique utilisée fonctionnait à la perfection dans Game Maker... Le procédé est le même, il faut simplement un peu filouter. Le problème, c'est que sa mise en place donne lieu a des limitations que je ne qualifierai pas : Impossibilité d'utiliser la transparence ou des sprites de plus de 255 pixels (oui, c'est scandaleux !)
Ce qui est étrange, c'est que cette technique fonctionne sur Game Maker, lequel n'est pas spécialement prévu pour faire ce genre de chose. Pourtant, sur Unity, qui en toute logique supporte la 3D comme aucun autre, ça ne fonctionne pas... :triste1:
Voici le liens vers le Shader utilisé dans Game Maker. Aussi, vous y trouverez peut-être un détail important que j'ai omis de prendre en considération : https://www.yoyogames.com/blog/458/z-ti ... th-sorting
Sinon, le pivot de mes sprites inclinés est fixé sur le centre-bas. Je pense que ça peut être utile de le savoir !

Cette histoire ne tient peut-être pas à grand chose et la solution est sans doute toute bête. En attendant, je suis un peu bloqué. :hehe:
Bref, toute aide sera la bienvenue ! Merci d'avance pour vos réponses futures.
Dernière édition par Zephyr Märchenwald le 07 Mai 2019 23:53, édité 1 fois.

Avatar de l’utilisateur
Zephyr Märchenwald
Messages : 8
Inscription : 16 Avr 2019 19:09

Re: Caméra et ordre dans les calques

Message par Zephyr Märchenwald » 30 Avr 2019 21:21

Bonsoir tout le monde !
Un petit up en passant. Les recherches de mon côté restent infructueuses... X|
Ce que je recherche est peut-être tout simplement infaisable sous Unity... :triste1:
M'fin, ce serait vachement étonnant, quand même !

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Caméra et ordre dans les calques

Message par Moi 1971 » 01 Mai 2019 08:54

Bonjour,
alors j'ai pas tout lu, j'avoue... trop long.. ;-)

Vous dites "Sur cette image de la Scène, on voit clairement que le rond gris est devant le mur noir."
Et là je dis non! Clairement c'est l'inverse.
- Si Unity utilise le centre géométrique de chaque objet , depuis la caméra le premier objet rencontré sur l'axe des z est le carré blanc.
Puis le carré noir et, de peu, le rond gris.
- Si Unity utilise le coin haut gauche de chaque objet , idem.
- Si unity utilise le coin bas droit de chaque objet,.. bha j'en sais rien faut tester..
Donc je dirais qu'il faut tester tous les cas possibles....
Le problème c'est que les différents plans de votre scène sont trop proche les uns des autres. Il faudrait, dans l'idéal, que la distance entre chaque plan, sur l'axe de profondeur de la caméra (z?) soit plus grand que la taille du plus grands des objets. Comme cela, pas de risque qu'un objet passe d'un rang à l'autre.
Donc pour votre cas :
le carré blanc, premier plan à z=10
le rond gris, deuxième plan z=20
le carré noir, troisième plan z=30
Chaque objet doit avoir une taille inférieur à 10

Ps :
"Sinon, le pivot de mes sprites inclinés est fixé sur le centre-bas. Je pense que ça peut être utile de le savoir !"
je viens de lire ça après, ça marche avec mon explication.

Avatar de l’utilisateur
Zephyr Märchenwald
Messages : 8
Inscription : 16 Avr 2019 19:09

Re: Caméra et ordre dans les calques

Message par Zephyr Märchenwald » 01 Mai 2019 17:59

Bonsoir !
Avant toute chose, merci pour votre réponse ! :-D

Il y a quelque chose que j'aimerais comprendre concernant cette caméra :
Calcule-t-elle sa distance à un objet sur UN axe donné (par exemple Z, comme dans l'exemple) ou directement en prenant compte l'environnement 3D (donc, avec les 3 axes) ?
Parce que ça change quand même pas mal de choses...

Dans mon exemple, les pivots du rond gris et du carrés noir sont définitivement à la même distance de la caméra sur l'axe Z.
Seulement voilà, ici, c'est surtout l'axe Y qui compte. Et, en effet, sur cet axe, le pivot du rond gris est plus proche de la caméra que celui du carré noir. Aussi, si on trace une ligne dans l'environnement 3D aligné sur l'axe X et partant de chacun des pivots jusqu'à la caméra, on se rend bien compte que le rond gris est plus proche de la caméra que le carré noir (pas sur l'axe Z, hein. Dans l'environnement 3D).

Il est précisément là, mon problème. Il me faut prendre en compte la distance à la caméra sur l'axe Z ET Y... Car un objet peut être sur ou sous un autre, mais il peut aussi être devant ou derrière ! Que le premier objet soit derrière ou sous un second objet, il faudrait que j'obtienne le même résultat : À savoir, une plus grande valeur de profondeur pour le premier objet comparé au second.
Voilà l’intérêt de savoir comment fonctionne cette caméra.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Caméra et ordre dans les calques

Message par Moi 1971 » 02 Mai 2019 10:17

Bonjour,
je ne sais comment la caméra fonctionne "précisément", mais en gros, c'est comme j'ai dit :-D
Ne pourriez vous pas faire un essai comme je vous l'ai montré et voir si cela convient à ce que vous chercher à faire?
Cette technique est connue pour les jeux. Ça devrait marcher.

Avatar de l’utilisateur
Zephyr Märchenwald
Messages : 8
Inscription : 16 Avr 2019 19:09

Re: Caméra et ordre dans les calques

Message par Zephyr Märchenwald » 03 Mai 2019 16:10

J'ai essayé de laisser une distance dix fois plus grande sur l'axe Z. Comme mon exemple se fait sur l'axe Y, ça ne fonctionne pas... :snif:
Aussi, je ne peux pas me permettre d'agrandir les distances sur l'axe Y, vu que ma projection se fait sur X/Y.
Bon... Je vais retentez d'exposer mon problème plus clairement, parce que je n'arrive toujours pas à comprendre si la caméra prend en compte tous les Axes ou uniquement l'Axe Z... :triste1:
TEST.png
TEST.png (16.54 Kio) Consulté 4639 fois
Sur cette image, la zone bleue est la zone ingame. La zone grise, la visualisation de la scène en 3D.
Sur la scène 3D, considérons les deux objets :
- "Carré Noir" que nous appellerons 1
- "Rond Gris" que nous appellerons 2
Les segments Y1, Y2, Z1 et Z2 partant respectivement des pivots de 1 et 2, ont la même direction que les axes Y et Z et s'arrêtent au niveau de la caméra.

Lorsque l'on compare les segments Z1 et Z2, on remarque qu'ils font la même taille. On en conclue que 1 et 2 sont à la même distance à la caméra sur l'axe Z. (Ce qui est normal, étant sur le même plan)
Cependant, en comparant Y1 et Y2, on voit très clairement qu'Y2 est plus long qu'Y1. On en conclue donc que 2 (le Rond Gris) a une plus grande distance à la caméra que 1 (le Carré Noir). Par conséquent, il devrait apparaitre derrière.
Pourtant, sur la vue ingame, le Rond Gris apparait devant le Carré Noir. Pourquoi ?

J'aurais pu envoyé une image du test avec les distance multipliée par 10 sur Z, mais ça donne le même résultat, naturellement.
Z1 et Z2 sont tous deux respectivement plus longs (de la même valeur) et Y1 comme Y2 conservent le même écart.
En plus, c'est pas très harmonieux sur la vue de la scène 3D. :-D (Même si bon, ingame, ça change rien au rendu)...

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Caméra et ordre dans les calques

Message par Moi 1971 » 03 Mai 2019 19:56

Bonsoir,
Si vous avez fait comme j'ai dit cela devrait fonctionner. Comme ce n'est pas le cas, là je ne peux vous aider plus. Je ne dois pas comprendre ce que vous voulez faire et quel est votre problème. Quelqu'un d'autre va sûrement intervenir, mais là avec les jours fériés au moi de mai, il va peut être falloir attendre un peu... Désolé ;-)

Avatar de l’utilisateur
Zephyr Märchenwald
Messages : 8
Inscription : 16 Avr 2019 19:09

Re: Caméra et ordre dans les calques

Message par Zephyr Märchenwald » 04 Mai 2019 04:45

Pas de souci ! Merci tout de même pour l'aide ! :-D
Je penses savoir de quoi vous voulez parler, et effectivement, ç’aurait pu être une solution si l'axe qui causait problème avait été celui de la profondeur (ici, Z, en l’occurrence).
Mais ici, c'est vraiment l'axe Y qui cause problème... Ce qui me fait dire que ce n'est pas une question de distance, c'est que s'il m'avait fallu fonctionner avec des calques, cet axe là n'en aurait pas eu besoin... Pour un jeu purement en vue de dessus, cet axe ne devrait poser aucun problème, mais ici, avec une vue 3/4 et des sprites orientés, tout dépend du fonctionnement de la camera, je suppose...

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Caméra et ordre dans les calques

Message par EmileF » 05 Mai 2019 10:02

Bonjour,
je ne suis pas très calé, mais depuis le début j'entends parler de sprite, de layer et de distance.
Mais si tout simplement vous modifiiez la valeur "Order In Layer" sur les sprites afin que celui qui doit être devant est une valeur plus petite que l'autre ? Voir: https://docs.unity3d.com/Manual/class-S ... derer.html
A voir peut-être.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Zephyr Märchenwald
Messages : 8
Inscription : 16 Avr 2019 19:09

Re: Caméra et ordre dans les calques

Message par Zephyr Märchenwald » 06 Mai 2019 13:44

Bonjour EmileF ! Tout d'abord, merci pour la réponse. ::d
C'est effectivement une méthode à laquelle j'ai pensé. Le problème, c'est que je n'utilise pas de calques (les layers), c'est un parti pris, basiquement, il est plus coûteux en terme de temps de s'en soucier lorsqu'on a énormément de niveaux à gérer (et comme je compte en général pouvoir bosser entre 10 et 20 niveaux de profondeur ainsi que des demi niveaux... Voilà ! :hehe:
Toute fois, si je voulais les utiliser, là où ça deviendrait compliqué, c'est qu'il me faut également trier mes sprites, lesquels sont orientés, sur l'axe des Y (donc, pas uniquement en profondeur !). Là où ça devient embêtant, c'est que les calques de profondeur ne peuvent être attribués qu'à un axe à la fois, en général Z... Et ça se comprend assez bien dans la mesure où les objets navigant sur les deux axes restant ne se contentent pas d'un niveau donné mais peuvent être en tous points de ces axes. Aussi, c'est justement ce que j'aimerais pouvoir faire avec cet axe Z ; le rendre aussi souple que les deux autres sur ce point...

En reprenant votre suggestion, il me serait toujours possible, au cas échéant, de me résigner à assouplir le fonctionnement de cet axe Z, d'utiliser cet "Order in Layers" ainsi qu'une technique différente pour l'axe Y. L'ennui, c'est que je vois difficilement comment définir les priorités entre ces deux méthodes selon les situations...

En bref, c'est faisable - à mon sens - mais tout de même assez désavantageux (là où je venais justement sur unity pour exploiter ses capacités en terme de 3D !)

Ce qu'il me faudrait, c'est vraiment un moyen de dire à la caméra de prendre en compte la distance en fonction de tous les axes plutot qu'un. (Comme on a coutume de faire dans la vraie vie pour mesurer une distance séparant deux objets, finalement !)

Répondre

Revenir vers « Unity le logiciel »