En bref : Nous construisons un système d'eau pour Unreal Engine avec deux promesses : de l'eau qui a l'air juste parce que la lumière, la couleur et l'écume sont calculées physiquement (non réglées à la main par scène) et de l'eau qui se comporte : jetez n'importe quel mesh sur la surface et il flotte, bascule ou coule correctement, sans aucun réglage. C'est en développement actif. Cet article explique ce qu'il couvre, comment nous nous tenons responsables avec des photographies de référence, pourquoi la flottabilité est la partie difficile que tout le monde saute, et où il se place aux côtés du reste de la boîte à outils.
La norme à battre. Notez ce qui rend cela réel : l'écume née des vagues qui déferlent, la brume mangeant les falaises, la statistique des moutons sur la houle ; rien de placé à la main, tout de la physique. C'est la barre que nous avons fixée.
Pourquoi un autre système d'eau ?
La plupart de l'eau des jeux est superbe dans exactement une condition d'éclairage : celle de la capture d'écran du store. Bougez le soleil, passez au ciel couvert, mettez la caméra à moitié sous la ligne d'eau, et elle s'effondre.
Il y a un second échec, plus silencieux, qui compte tout autant : presque tous les systèmes d'eau traitent les objets flottants comme une arrière-pensée. Vous obtenez un modèle de bateau, une page d'instructions de gréement de pontons, et l'hypothèse tacite que personne ne jettera jamais une caisse au hasard dans la mer. Les joueurs jettent des caisses dans la mer constamment.
Nous voulions deux choses qui ne coexistent actuellement pas dans un seul paquet : un rendu de qualité cinéma qui survit à n'importe quel éclairage, et un comportement physique qui ne demande aucun réglage. Ni l'un ni l'autre n'est atteignable en tripotant des paramètres jusqu'à ce qu'une capture soit jolie, car une capture est une seule image sous un seul soleil, et dès que l'un des deux change, l'eau réglée au goût montre ses coutures. Le fondement du projet n'est donc pas une liste de fonctionnalités. C'est un test d'acceptation avec lequel un humain ne peut discuter : une photographie.
Jugée face à des photos, pas au goût
Le développement est verrouillé par des photographies de référence avec des contrats fixes de caméra et d'éclairage : unités de lumière physiques, un tonemapper verrouillé, et une métrique de différence perceptuelle décidant réussite ou échec, pas l'humeur du jour d'un directeur artistique.
Deux références sont canoniques, et elles ont été choisies pour être opposées :
- Un lac clair, caméra dans la ligne d'eau. Moitié air, moitié eau, une frontière ondulée sans bande d'artefact ; eau côtière verdâtre dont la couleur s'approfondit avec la distance ; caustiques sur les rochers qui correspondent à la surface au-dessus ; troncs immergés se courbant correctement à l'interface. Celle-ci teste la réfraction, la traversée de la ligne d'eau et l'absorption de couleur sous l'eau, tout à la fois.
- Une côte de tempête sous ciel entièrement couvert. Pas de soleil, pas de bande de scintillement : la mer doit se lire par la réflexion douce du ciel, un gris-vert désaturé, la statistique des moutons et la brume sur les falaises. Une bouée chevauche la houle avec une période et une inclinaison crédibles ; le comportement fait partie de l'acceptation, pas seulement l'image fixe.
La référence couverte est délibérément l'une des deux. L'eau ensoleillée flatte tous les moteurs de la Terre : le scintillement spéculaire cache une multitude de péchés. Enlevez le soleil, et l'eau doit porter l'image par la seule rugosité des réflexions, la couleur et le mouvement. C'est le test honnête, et c'est celui que la plupart des systèmes évitent discrètement. Un océan qui n'a l'air bien qu'au soleil ne sort pas.
Le côté caméra est spécifié aussi strictement que le côté eau, car une comparaison photo n'est équitable que quand la caméra ne peut pas tricher. Cela signifie de vraies intensités lumineuses physiques (un soleil de midi autour de 100 000 lux, pas un curseur de luminosité arbitraire), une exposition fixe, et une configuration fixe de tonemapping et de bloom par référence. Changez le tonemapper et n'importe quelle eau peut être faite pour coller à n'importe quelle photo ; c'est exactement pourquoi le tonemapper est cloué en premier.
Drop-a-Mesh : flotter sans les devoirs
Glissez n'importe quel mesh sur un plan d'eau Numivo et il se comporte correctement immédiatement : le système construit automatiquement un proxy physique, calcule le volume déplacé par frame à partir de la hauteur de vague réelle, et déduit flotte-ou-coule de la densité réelle.
Sous l'eau est un lieu, pas un post-process. La couleur s'absorbe avec la profondeur, la lumière filtre en faisceaux, et l'interface au-dessus doit être traversée proprement : la référence du lac existe pour tenir les trois honnêtes à la fois.
Un tronc flotte et roule sur son côté long. Une caisse ballotte. Une statue de pierre coule. Pas de gréement, pas de placement de pontons, pas de scripts. Sous le capot :
- la forme de collision est voxelisée automatiquement (de façon asynchrone, et mise en cache par asset pour ne se produire qu'une fois) afin de mesurer le volume réel de l'objet ;
- la flottabilité est calculée physiquement à chaque frame à partir du volume déplacé face à la densité de l'eau, et l'eau douce et l'eau salée diffèrent réellement (l'eau salée est plus dense, donc la même caisse flotte plus haut en mer que dans un lac) ;
- flotte-ou-coule vient de la densité, la masse divisée par le volume du proxy ; il n'y a pas de case « ceci doit-il flotter ? » par défaut, car le défaut est la physique ;
- la stabilité émerge de la façon dont le volume du proxy est distribué : les caisses lourdes du haut chavirent, les coques lestées à la quille se redressent, une planche reste à plat ;
- les objets flottants se recouplent à la surface : ondulations, sillages, un anneau d'écume à la ligne d'eau, et des effets d'éclaboussure à l'impact.
Il y a un petit panneau sur l'actor pour les surcharges (forcer à flotter, forcer à couler, un curseur d'amortissement, des interrupteurs de sillage et d'éclaboussure), mais une surcharge met à l'échelle la physique plutôt que de la remplacer. Forcez un rocher à flotter et il ballotte quand même avec la bonne période et laisse le bon sillage ; il se comporte juste comme s'il était plus léger. Cette distinction compte : les résultats forcés qui ignorent le solveur ressemblent à des props collés à un plan, et les joueurs le remarquent instantanément.
L'objectif de conception est net, et c'est une démo que nous voulons pouvoir faire en direct : quelqu'un glisse vingt props au hasard sur la mer, et tout se comporte simplement : sans ouvrir une seule fenêtre de réglages d'abord. Si cette démo a besoin d'un tutoriel, la fonctionnalité a échoué.
Ce qu'il couvre
Eau côtière, océan ouvert, sous l'eau et bassins de grotte sont tous de première classe : vagues basées sur le spectre avec houle et mer croisée séparées, écume issue de vagues qui déferlent vraiment, caustiques pilotant les faisceaux de lumière sous-marins, et stabilité sous les effets cinématiques.
Les spécificités qui comptent si l'eau vous importe :
- Les vagues viennent de spectres océanographiques (les mêmes modèles statistiques utilisés pour décrire les vraies mers), avec étalement directionnel et houle contrôlable indépendamment. Un état de mer devient une décision météo, « tempête qui monte, longue houle d'ouest », plutôt que trente curseurs déconnectés que vous poussez jusqu'à ce que ça ait l'air orageux.
- L'écume n'est pas un masque peint. Elle naît là où les vagues déferlent réellement, vieillit avec le temps et s'étire sous le vent. L'écume peinte est le signe le plus commun d'une eau fausse, car elle ne bouge pas avec la physique qu'elle est censée représenter.
- Sous l'eau est un vrai lieu. Absorption de couleur correcte selon la profondeur (le rouge part d'abord, puis le vert, laissant le bleu profond que tout le monde connaît des séquences de plongée), des faisceaux de lumière dérivés du même champ de caustiques qui éclaire le fond, et une traversée à la ligne d'eau sans la classique bande d'artefact dure.
- Les bassins de grotte ont leur propre traitement (eau immobile ou à peine mouvante, perturbations de gouttes, reflets dans la quasi-obscurité) car un bassin intérieur calme expose des défauts différents de l'océan ouvert.
- Les cinématiques sont des critères d'acceptation, pas une arrière-pensée. La surface doit rester stable sous la profondeur de champ, le flou de mouvement et le grain : pas de fireflies spéculaires qui n'apparaissent qu'une fois le grain appliqué, pas de scintillement qu'une caméra lente transforme en stroboscope.
Pourquoi la flottabilité est la partie que tout le monde saute
Le rendu peut être simulé avec un bon shader, mais pas le comportement : un flotte-et-coule convaincant a besoin d'une estimation de volume en temps réel et d'un solveur stable, ce qui est vraiment difficile, alors la plupart des systèmes livrent un prefab de bateau et s'arrêtent.
L'inconfortable vérité d'ingénierie est qu'un beau shader d'eau est un problème résolu et qu'un solveur de flottabilité général ne l'est pas. Simuler le rendu d'une vague est un problème de texture et de normales ; faire s'asseoir correctement dans cette vague un mesh arbitraire, jamais vu auparavant, est un problème de physique qui doit tourner à la fréquence d'images, survivre à des pas de temps rapides, et ne pas exploser quand un rocher de mille triangles rencontre une houle de tempête. Cet écart est pourquoi « l'eau » dans la plupart des moteurs signifie « un joli plan avec lequel on ne peut pas interagir », et pourquoi la partie interactive, quand elle existe, est un bateau créé à la main.
Combler cet écart (rendre le comportement aussi automatique que le rendu) est la raison d'exister de ce projet et la raison pour laquelle il faut de la discipline de photo de référence plus un vrai solveur plutôt qu'un week-end de travail sur shader.
Quand pourrez-vous l'utiliser ?
C'est en développement comme extension Unreal Engine, avec un déploiement par étapes : un aperçu flottant cinématique arrive avant le solveur physique complet, pour que les scènes puissent être peuplées tôt. Nous n'annonçons pas de date ; les images de référence décident quand c'est fini.
L'étalement est délibéré. Un aperçu cinématique (les objets suivent la surface des vagues sans simulation de force complète) arrive d'abord, pour que les artistes puissent déposer des meshes et peupler une mer pendant que le lourd solveur est encore durci ; vous ressentez le résultat bien avant que la physique soit finale. Le solveur complet, l'auto-proxy et le panneau complet suivent. Progrès et jalons apparaissent sur la roadmap publique, pas dans une surprise du jour de lancement.
La boîte à outils aux côtés de laquelle il sortira (scatter, mesh blending, grilles, mesure) est gratuite à essayer aujourd'hui. Si vous voulez être notifié dès qu'un build public d'eau existe, le Discord lié depuis le site est l'endroit où ce sera annoncé en premier, et où les comparaisons réussite/échec des images de référence seront postées au fur et à mesure.
Mini-FAQ
Faudra-t-il les autres outils de Numivo ? Non, c'est une extension de la même famille, conçue pour tenir seule. Elle partage toutefois le même principe : les résultats se cuisent en données natives du moteur partout où c'est physiquement possible, pour que vous possédiez ce que vous faites.
Quelles versions de moteur ? Les versions actuelles d'Unreal Engine 5. Les spécificités atterrissent sur la roadmap à mesure que l'extension approche d'un build public, plutôt que d'être promises maintenant et révisées plus tard.
En quoi est-ce différent de l'eau intégrée au moteur ? Les systèmes d'eau intégrés sont forts sur le rendu et faibles sur l'interaction générale : la flottabilité est typiquement un composant séparé, réglé à la main. Tout l'intérêt ici est que le rendu et le comportement viennent d'un seul système physiquement fondé, avec le verrou de la photo de référence gardant le rendu honnête à travers les éclairages.
Pourquoi annoncer avant la sortie ? Parce que la méthode de la photographie de référence est elle-même le sujet. Nous préférons montrer la barre publiquement et être mesurés à son aune que révéler une chose finie que personne n'aurait pu scruter. Cet article est cette barre, par écrit, tenez-nous-y.