# Applications > Dveloppement 2D, 3D et Jeux > Moteurs 3D >  Pourquoi les objets courbs n'existent pas ?

## bricechris

Bonjour,

*Pourquoi les objets rellement courbs n'existent pas ?* Je n'en est jamais vu le moindre dans n'importe quel jeu vido - et pourtant j'en ai tests beaucoup !

Je m'explique : prenez un barreau dans une prison modlise dans un JV : en fait, il n'est pas courb, mais compos d'une multitude de polygones, ce qui quand on zoom dessus, fait cet effet de "marche".

Bref, les polygones courbs, pourquoi y en a pas ?

Cordialement,

----------


## LittleWhite

Bonjour,

Il y aura toujours des effets d'escalier, plus ou moins visibles selon le niveau de dtails de la mesh.
Pourquoi, simplement car l'ordinateur utilise des points. Et que c'est la multitude points qui forme la courbe. Si cette multitude de points est trop dtaill pour un objet que l'on verra que trop peu, cela ne sert pas  grand chose de perdre des performances dessus.
Car, plus un objet est dtaill (ou complexe) plus il prend de la mmoire, plus on prend du temps  le dessiner.

Bon, rassurez vous, on arrive tout de mme  voir de belles courbes.

----------


## oxyde356

Car les seuls figures gomtriques que sait dessiner une carte graphique sont les points, les lignes et les triangles. Du coup, on ne peut faire que des approximations de courbes. Le seul vrai moyen pour dessiner une courbe visuellement parfaite et de faire en sorte que l'approximation ne soit pas visible, ce qui est parfaitement faisable si l'on prend en compte la taille des pixels finaux. Par exemple si on veut tracer une courbe en 2D et que l'on sait qu'elle va s'taler sur 100 pixels alors on n'utilisera pas le mme nombre de primitives que si elle s'talait sur 10 pixels. Dans le cas des 100 pixels on tracera 100-1 lignes et dans le cas des 10 pixels 10-1 lignes. Avec un systme qui grerait des "vrais courbes" on ne pourrait obtenir de meilleurs rsultats visuels vu que l'affichage en pixels est dj l'approximation d'un rendu. Le problme c'est qu'estimer de combien de points une courbe doit tre formes pour tre visuellement parfaite et l'adapter en temps rel peut tre trs coteux et ne vaut pas souvent le coup.

----------


## gbdivers

> Pourquoi les objets rellement courbs n'existent pas ?





> Il y aura toujours des effets d'escalier, plus ou moins visibles selon le niveau de dtails de la mesh.





> Car les seuls figures gomtriques que sait dessiner une carte graphique sont les points, les lignes et les triangles.


Bon, je vais encore aller  contre sens  ::): 

Les objets "courbs" peuvent exister. Je pense par exemple au Phong tessellation (GPU Pro II-1) ou aux fonctions NURBS (GPU Pro II-3). Il est tout  fait possible de reprsenter par exemple une sphre avec son quation et raliser un rendu sans "escalier" quelque soit le zoom.

*Pourquoi dcouper une forme en polygone plutt que de travailler avec les quations ?*
Simplement pour des raisons de performances.

Les calculs raliss en utilisant des lignes (ou des triangles, c'est la mme chose) sont relativement simples et performants. Lorsque l'on souhaite afficher une ligne (ou une courbe) entre 2 points, le moteur de rasterisation doit calculer les points intermdiaires. 

Dans le cas d'une ligne, on dispose en particulier de l'algorithme incrmental de Bresenham qui permet de calculer les points d'une ligne en minimisant les oprations de multiplications et divisions. Comme on peut toujours reprsenter une forme par un ensemble de triangles et que l'on a rarement besoin d'une reprsentation "exacte" d'une forme, les cartes graphiques utilisent historiquement que la reprsentation par triangle dans le moteur de rasterisation (ce n'est plus le cas avec les dernires versions d'OpenGL 4 et DirectX 11 qui permettent de programmer les moteurs de rasterisation).

En revanche, lorsque l'on souhaite dessiner une courbe, il faut calculer chaque point avec des calculs complexes utilisant des multiplications/divisions/fonctions trigonomtriques, etc. qui baissent normment les performances. Pour les jeux par exemple, o l'on recherche avant tout la performance, ces approches ne sont applicables qu'avec des cartes graphiques rcentes et puissantes.

Mais il est tout  fait possible de gnrer le maillage dynamiquement en fonction du zoom (et donc du nombre de points  afficher), mais toujours avec un cot norme en terme de performance.




> Car, plus un objet est dtaill (ou complexe) plus il prend de la mmoire, plus on prend du temps  le dessiner.


Du coup, non. Il peut dcrire un objet avec des quations (et donc peu de paramtres) et avoir pour autant un objet plus complexe. Par contre, cela  un coup en terme de performances.
On peut citer aussi la gnration de formes par fractales (des arbres par exemple).

----------


## oxyde356

Tu ne vas pas vraiment  contre sens, en gros tu dis qu'on peut stocker une courbe "parfaite" (encore heureux  ::P: ) mais que pour l'afficher il faut s'adapter au rasterizer, c'est exactement l'ide que j'nonais  ::P:

----------


## pyros

Je pense que c'est plus une question de polyvalence qu'une question de perf.

Les premier moteurs graphiques utilisaient plutt des surfaces analytiques (essentiellement des quadriques), car le calcul de normal (donc d'clairage), ainsi que le calcul d'intersection est beaucoup plus rapide avec une surface analytique qu'avec des triangles, sans parler de la consommation mmoire.

Les motos du premier TRON sont compos uniquement de quadriques, et je me souvient d'un vieux jeu d'aventure (Ecstatica) bas sur un moteur ellipsodale o les persos taient fait uniquement d'ellipses (ce qui nous donnait des heros fortement membr  ::ccool:: ).

Lorsque la mmoire a commenc  devenir accessible, les triangles se sont dvelopp car ils permettaient de crer des formes plus gnral plus facilement. Et c'est  ce moment qu'on a commenc  acclrer au maximum le trac de triangles et  crer des cartes graphiques digne de ce nom  ::):

----------


## gbdivers

> Tu ne vas pas vraiment  contre sens, en gros tu dis qu'on peut stocker une courbe "parfaite" (encore heureux ) mais que pour l'afficher il faut s'adapter au rasterizer, c'est exactement l'ide que j'nonais


Dsol, je n'avais pas bien compris alors.

Bon, l'ide est dans tous les cas que c'est possible d'afficher des courbes mais que c'est trs coteux  ::):  (remarque : on le trouve peut tre pas encore dans les jeux, ou que dans les jeux rcents avec grosses cartes graphiques, mais il est probable que cela soit dj utilis dans certaines applications industrielles, qui ont plus besoins d'avoir des rsultats "bons" que rapides)

----------


## bricechris

Oui, je vois.  ::): 

Donc, selon vous, il serait plus coteux de modliser un tronc d'arbre avec une courbe parfaite utilisant le bon algorithme pour a, plutt que disons 15-20 polygones mis bout  bout (style cristal taill en prisme) ?

----------


## LittleWhite

Oui,

Je pense qu'il est toujours plus couteux d'essayer de dessiner plus de dtails.
Aprs, il faut savoir qu'il y a un compromis  faire, entre le niveau de dtails d'un objet simple et les performances.
Si vous avez une scne avec 30000 arbres, vous allez prfrer avoir un mesh tout simple qu'une formule permettant de gnrer un arbre tout beau.
Mais si vous avec une scne avec 1 seul arbres, alors mettez le paquet sur la beaut de l'arbre. Utilisez les formules qui vous amusent pour que le niveau de dtail soit le plus proche de la ralit (bien que vous aurez toujours les limitations de la machine).

----------


## pyros

Cela dpend de la technique utilis. Du ray-tracing est beaucoup plus rapide avec des primitives analytiques (c'est d'ailleurs pour a que la plupart des dmo technique en ray-tracing affichent des sphres).

Les cartes graphique par contre sont conus pour rasteriser du triangles. Il est en effet plus facile de modliser des formes compliqus avec plus ou moins de triangles qu'avec des surfaces analytiques. Donc on a cr des GPU extrmement performant qui ne savent faire que des triangles.

Le "tout triangle" est apparu au cours des annes 90, lorsque les cartes graphiques se sont dveloppes et qu'on a su faire du triangles trs rapidement. Mais avant, on avait droit  toutes sortes de techniques de rendu:
3D ellipsodal (cf mon poste prcdent)3D Voxel (commanche 3, outcast)3D "file de fer" compos uniquement de ligne ou splines (surtout en CAO, IBMCAD)3D prcalcul (megarace 2, FFVII, area51, mais a compte pas trop car la 3D initial peut tre en triangle, ray-tracing ou peinture aquarel ^^)3D isomtrique encore trs prsente, mme si ce n'es pas de la 3D  proprement parl (sim city, sonic 3D, Diablo)

Tout a pour dire que si le rendu triangle est plus rapide, c'est parce qu'on a des processeurs spcialiss dans ce type de rendu. Mais certaines choses ne peuvent pas se faire sur carte graphique (reflexion/refraction, ray-tracing en gnral, ou pour des scnes extrmements compliqus qui ncessiteraient plusieurs miliard de polygone, il est parfois ncessaire de l'optimiser en utilisant des surfaces analytiques et effectuer un rendu sur CPU)

----------


## screetch

Un simple pixel shader permet de faire des courbes parfaites quel que soit le zoom, c'est une technique applique dsormais dans le rendu des polices de caractres
cela consiste a envoyer des triangles au GPU vec une equation, le GPU pour chaque pixel value l'quation et calcule si le point est visible ou pas.

----------


## oxyde356

Dessin vectoriel :o

----------


## screetch

bah oui.
Mais de l a tendre a des arbres ou des trucs pareils...

----------


## pyros

Ca doit bien tre possible des faire des arbres procdural uniquement en shader  ::D:

----------


## oxyde356

Moui avec geom shad, transform feedback mais l on est plus vraiment sur du temps rel ou sinon on a un truc tout moche  ::D:

----------


## sylvain230

Par rapport aux objets courbs, la raison pour laquelle ils n'existent pas est simple. 
Un ordinateur est une machine qui effectue des calculs simples avec des 0 et des 1 et qui utilise ce que l'on appelle des mathmatiques discrtes.
Qui dit discret ne dit pas continue donc un nombre limit de point.
En effet, lors de la modlisation d'un objet aussi complexe que vous le dsirez, mme si il a beaucoup de triangles(des milliers, des millions ...) , il aura toujours une valeur finie de triangle.
Un ordinateur ne possde pas la notion de l'infini. Cela n'existe pas en informatique. 
Donc si on effectue un zoom sur l'objet, il finira par se pixeliser.

----------


## LLB

> Donc si on effectue un zoom sur l'objet, il finira par se pixeliser.


a dpend comment est fait reprsent l'objet et comment est fait le zoom (en vectoriel, par exemple, on peut zoomer  l'infini sans pixellisation ; si tu dessines ton objet sur GPU, tu peux facilement te passer de la pixellisation aussi).

----------


## sylvain230

Tu peux m'expliquer un peu plus en dtail comment tu fais pour avoir un objet toujours dtaill en zoomant ?
Parce que la je ne vois pas bien.  ::aie:: 

Ou tu peux me donner un exemple ?

----------


## screetch

pour tracer, par exemple, une courbe (un extrait d'une courbe) tu traces un triangle et a ce triangle, tu associes un pixel shader.
Ce pixel shader va calculer pour chaque pixel si il est plus grand ou plus petit qu'une certaine fonction (que tu peux ajouter comme proprit de vertex lorsque tu envoies le triangle au GPU)
etant valu pour chaque pixel, si tu zooms, il va juste recalculer de plus en plus de pixels. Tu peux zoomer a l'infini.
Tu peux facilement tracer des courbes de bezier ainsi, et comme les polices de caractres sont des courbes de bzier en gnral, tu peux tracer du texte par exemple

Le jeu francais R.U.S.E. utilise cette technique, sans doute pour le rendu des polices (ils utilisent Scaleform qui je crois utilise cette techno) mais aussi pour les fleches et autres objets qu'ils affichent sur la carte, et mme pour la petite balle rebondissante de l'ecran de chargement  ::): 
c'est automatiquement une trs bonne rsolution et mme antialias gratuitement!

----------


## oxyde356

Il suffit de faire en sorte que le dessin suive un modle mathmatique particulier comme par exemple un vecteur d'origine (0,0) et de direction (1,1), si tu dessine un segment qui suit la dfinition de ce vecteur relativement  la taille de ton rasterizer et bien tu peux zoomer  l'infini  la position (0.5,0.5) tu auras toujours un trait parfait car on ne stocke pas un niveau de le dtail on le gnre  chaque affichage et tout ce que l'on stocke c'est un vecteur et pourtant on peut en gnrer un niveau de dtail infini. Dessine la fonction COS sur ta calculette et zoom 50x sur la courbe tu obtiendras toujours une courbe de mme largeur et toujours plus prcise.
En gros tu as deux faon de faire, voil un autre exemple, un cercle peut se dfinir comme :
- Une approximation par un ensemble de points relis entre eux.
- Un cercle de rayon R et de centre C.
Aprs les fonctions d'affichage ne sont pas du tout les mmes, dans le premier cas on affiche simplement les points stocks, dans le deuxime on gnre des points de faon  tre aussi prcis que le rasterizer (plus ne servirait  rien).

----------


## bafman

> Le jeu francais R.U.S.E. utilise cette technique, sans doute pour le rendu des polices (ils utilisent Scaleform qui je crois utilise cette techno) mais aussi pour les fleches et autres objets qu'ils affichent sur la carte, et mme pour la petite balle rebondissante de l'ecran de chargement 
> c'est automatiquement une trs bonne rsolution et mme antialias gratuitement!


en fait, scaleforme n'est utilis que pour l'interface outgame. l'interface in game est faite main, et, effectivement, la techno de police de caractres est utilis pour les texts au cours du jeu (notemment, les labels d'objectifs qui subisent des transformation 3D tout en restant lisibles, ce qui n'est pas evident  faire avec des font  base de glyph uniquement. Par contre, la techno full vectoriel n'a pas t utilis car elle est trop couteuse en terme de perf (mais elle marche  :;): ). la techno utilis dans le jeu est plus proche d'un antialiasing de type MSAA (enfin dans le genre quoi)

sinon, la baballe raytac n'est pas presente dans le jeu final, et le loc lac, c'est bon, mais c'est gras.

P.S. : je sais qui tu est  ::mrgreen::

----------


## screetch

ca c'est malin, je sais pas qui t'es!!!
[edit] et on dit pas de mal du loc lac  ::(:

----------


## bricechris

Je ne vois pas pourquoi il faudrait un nombre infini de points pour placer une courbe, puisque sur un segment de polygone, il n'y en a que deux.

Sur une courbe, on aurait j'imagine le dbut et la fin, comme sur un polygone droit, mais sauf que l a ne serait pas droit, mais courb selon une certaine incidence.  ::?:  Alors que peut-tre, effectivement, l'algo pour afficher a serait un poil plus long  excuter, mais de l  tre hors de propos...

----------


## LittleWhite

> Je ne vois pas pourquoi il faudrait un nombre infini de points pour placer une courbe, puisque sur un segment de polygone, il n'y en a que deux.
> 
> Sur une courbe, on aurait j'imagine le dbut et la fin, comme sur un polygone droit, mais sauf que l a ne serait pas droit, mais courb selon une certaine incidence.  Alors que peut-tre, effectivement, l'algo pour afficher a serait un poil plus long  excuter, mais de l  tre hors de propos...


Il en faux quatres avec Bezier, le debut, la fin, et des sortes d'attractor. On peut en avoir plus et je crois que du Bezier avec trois est possible aussi, mais gnralement, c'est 4.

a c'est pour placer / dfinir la courbe. Une fois que cela est fait, il faut la dessiner. Et c'est lors du dessin, qu'il faut placer assez de points pour que la courbe ne soit pas coupe.

----------


## pyros

> Je ne vois pas pourquoi il faudrait un nombre infini de points pour placer une courbe


Ca dpend ce qu'on entend par point. Il faut 2 points pour dfinir (mathmatiquement) un segment, mais il faudrait une infinit de pixels pour le tracer exactement. Pour les courbes, que ce soit spline, bezier ou autre, il s'agit en gnral de courbes polynmiales. Et un polynme de degr n ncessite n+1 points pour tre dfinie.

Rq: Une droite est un polynme de degr 1 => 2 points. Spline cubique, degre 3 => 4 points  ::ccool:: .

----------

