PDA

Voir la version complète : De la 2.5D en 3D



Ohliv
22/02/2008, 13h51
Bonjour à tous,
Yamp, un membre espagnol du forum a programmé une fonction phénoménale qui permettait de rendre en 3D des plans d'arbres en 2D. Une programmation en Coffee et Xpresso.
L'exemple en vidéo : http://www.jcuadras-arquitecto.com/AnimacionesC4d/Animacion120.html

Pour des animations en archi, c'est un gain de polygones énormes :bave: Je sais qu'il existe le plugin RPC qui reproduit ce genre de choses mais apparemment pas compatible avec Vray et de plus assez lourd à gérer....

Est-ce une programmation complexe, ou y a t'il des fonctions Coffee ou Xpresso facilement accessibles pour réaliser ce genre de choses ? Je me doute bien que l'on ne se lance pas là dedans tête baissée mais rien que pour ça, j'y mettrais bien mon nez :D

Merci d'avance :wink:

Luc
22/02/2008, 14h02
Salut Ohliv,

Cette technique est utilisée depuis longtemps en 3d puisque il fallait pouvoir des arbres en 3d mais peu gourmands en poly et en ressources machine.

La technique n'est pas bien compliquée puisqu'il suffit de charger une texture d'arbre + alpha sur un plan 3d et de dupliquer 5 fois ce même plan et de positionner ces plans 6 plans en étoiles.

L'effet est assez sympa vue de loin mais reste minimaliste si on zoom dessus.

:wink:

Ohliv
22/02/2008, 14h37
Merci de ta réponse, Luc.
J'ai en effet déjà testé la méthode que tu m'as décrite mais comme tu le soulignes, l'effet n'est pas extra vu de prés...La différence avec le 'truc" de Yamp, c'est que même de près, l'illusion est parfaite. Ca m'a l'air d'être bien plus complexe que de la duplication d'objets. Dommage qu'il ne vende pas son secret, j'achète tout de suite !!!! :mrgreen:

Yamp
27/12/2008, 23h54
Salut Ohliv et Luc

Je n'avait pas vu ce message.
Pour faire l'animation j'ai utilisé 360 images, l'une par chaque degré de rotation.
Autre animation c'est:
http://www.jcuadras-arquitecto.com/AnimacionesC4d/Animacion119.html

Tengaal
28/12/2008, 02h23
oui en effet l'effet marche bien, l'illusion 3D fonctionne.

pour résumer une méthode possible pour cet effet (ce n'est peut-être pas celle utilisée par Yamp) :

- on calcule en format PSD avec alpha, 360 images numérotées d'un arbre qui fait une rotation H de 360 °. (1 image = 1°) on obtient les images "arbre_0000.psd" à "arbre_0359.psd".
- on a un plan orienté constamment vers la camera (tag "pointer vers la camera") qui représente l'arbre
- sur ce plan, on applique un matériau "arbre" avec dans les canaux "couleur" et "alpha" l'image "arbre_0000.psd".
- on se place par exemple à la frame 10F de l'animation
- à cet instant, la caméra est orientée par exemple avec un angle H (axe Y du monde) de 28°
- donc grâce au COFFEE, on accède aux paramètres du matériau "arbre" et on y définit l'image "arbre_0028.psd" dans les canaux "couleur" et "alpha".


Ainsi à chaque frame de l'animation, l'angle de rotation de la caméra définit directement le numéro de l'image qui doit être mappée sur le plan pour donner l'illusion de vrais arbres 3D autour desquels on tourne...

Le format RPC fonctionne sur ce principe, par contre toutes images calculées sous les différents angles, (ainsi qu'avec les animations d'objets comme un personnage qui marche) sont stockées dans un seul fichier de format RPC dans un ordre bien précis, le plugin RPC dans C4D se charge de définir l'index de l'image souhaitée dans ce gros fichier, en fonction de l'angle de la caméra et du temps de l'animation si l'objet RPC est animé.

Yamp
28/12/2008, 11h09
Oui, Tengaal, c'est comme ça que je l'ai fait.

Mais, Il n'est pas possible seulement utiliser le tag "pointer vers la camera", donc si nous élevons la camera le plan il s'incline. Il faut aussi de fixer la verticalité du plan au moyen de XPresso

Tengaal
28/12/2008, 13h43
oui pour l'orientation des plans face à la camera j'étais parti de l'hypothèse la plus simple, avec une caméra qui est constamment à hauteur de vue humaine, donc des plans qui restent toujours "debouts" face à la caméra.

En effet dès que la caméra prends de l'altitude, il ne faut pas que les plans se couchent sur le sol, il faut uniquement leur faire conserver leur rotation libre sur Y (rotation H). :wink:

ld
28/12/2008, 13h59
Ma question est peut-être idiote mais 360° ça fait 360 polys même s'ils ne sont pas constamment visibles ça alourdi pas mal la scène non?
Est-ce qu'on ne peut pas diviser par 2, par exemple 180 polys, 1 tous les 2 ° sans que l'effet ne se voit trop?

Tengaal
28/12/2008, 14h46
??? :o

heu tu n'as pas dû comprendre le principe de la chose on dirait...

tu as seulement 1 polygone (1 rectangle constamment orienté vers la caméra donc vu de face), et celui-ci est texturé avec un matériau donc la texture change en fonction de la rotation de la caméra.

Donc, alors que tu vois un arbres en volume, en fait c'est seulement un rectangle toujours face à la caméra qui créé l'illusion avec dessus un mapping de l'arbre précalculé vu dans un certain angle. les 360 images du vrai arbres 3D sont précalculées et servent de texture pour le matériau "animé" sur le plan, si on peut dire...


Donc avec cette technique, 1 arbre = 1 polygone, on peut donc facilement créer des milliers d'arbres dans la scene 3D avec un rendu très rapide, plutôt que d'utiliser un vrai arbre 3D (constitué de plusieurs milliers de polygones) en de dupliquer celui-ci en millier d'autres arbres, là la machine va très vite ramer pour gérer tout ça.

ld
28/12/2008, 14h59
Effectivement j'ai lu un peu trop en diagonale désolé :oops:
merci de ta réponse.

oli_d
28/12/2008, 18h56
Bonjour,

Le sujet m'intéresse particulièrement et cela fait un moment que je voulais me lancer dans cette problématique.

Si cela peut aider j'ai écrit ce bout de code qui fonctionne dans un tag COFFEE, en allant rechercher le nom de la texture et en remplaçant les trois derniers caractères par l'angle entre la caméra et l'objet. (nom000.psd en nom045.psd par exemple) et ceci dans les canaux couleur et alpha.

Tout fonctionne, mais le seul problème c'est au moment du rendu, car la mise à jour ne se fait pas dans la texture vu qu'il ne détecte pas d'évènement :coup: si quelqu'un à une idée avant que je me lance dans un plug en c++.

main(doc,op)
{
var camera = doc->GetActiveBaseDraw()#BASEDRAW_DATA_CAMERA;
var posc = camera->GetMg()->GetV0();
var pos =op->GetMg()->GetV0();
var vect = VectorToHPB(posc-pos);
var angle = int(Degree(vect.x)+0.5);
var angl_str;
if (angle<0)angle=360+angle;

if (angle<10) angl_str="00"+tostring(angle);
else if(angle<100) angl_str="0"+tostring(angle);
else angl_str=tostring(angle);

var tg = op->GetFirstTag();

while(tg)
{
if(instanceof(tg,TextureTag))break;
tg=tg->GetNext();
}

var mat = tg#TEXTURETAG_MATERIAL;
var chan =mat->GetChannel(CHANNEL_COLOR);
var chanbc =chan->GetContainer();
var nom =chanbc->GetData(CH_TEXTURE);

var pos=strchr(nom,"."[0]);
var nom2 =strins(nom,angl_str,pos-3);
chanbc->SetData(CH_TEXTURE,nom2);
chan->SetContainer(chanbc);

var chana =mat->GetChannel(CHANNEL_ALPHA);
var chanabc =chana->GetContainer();
chanabc->SetData(CH_TEXTURE,nom2);
chana->SetContainer(chanabc);

mat->Update();

}

Tengaal
28/12/2008, 19h54
Pour qu'un script COFFEE ou Xpresso s'execute même si aucune action sur les objets n'est faite, mais juste une animation de camera, il faut aller dans les attributs du tag COFFEE ou Xpresso puis cocher la case "dépendant de la camera".

Sinon sans cette option cochée, il faut laisser tourner l'animation pour que le matériau s'actualise en permanence (execution du script à chaque image), et on voit l'effet en temps réel dans la vue editeur.

Ohliv
28/12/2008, 20h36
Ca c'est du déterrage :mrgreen:
Merci Yamp d'avoir répondu. J'aperçois déja mieux comment tu as procédé. La partie Coffee, c'est du chinois pour moi, mais je vois que cette technique suscite l'enthousiasme de certains. Merci Oli-D et Tengaal de bosser sur le plug, il risque de devenir un must-have pour les scènes d'archi extérieure :poucehaut:

oli_d
28/12/2008, 21h04
Merci beaucoup maître Tengaal :prie:,

ça marche maintenant je ne m'étais jamais posé la question de l'utilité des options du tag COFFEE.

oli_d
28/12/2008, 21h18
Une petite anim pour montrer le résultat, j'ai juste mal centré mon arbres quand j'ai généré les 360 images pour la texture ce qui fait qu'il bouge au sol !

http://campus.hesge.ch/eil/e-eil/od/test2.avi

Si je veux utiliser cette technique dans une scène et que j'ai beaucoup d'arbres, théoriquement je devrais avoir autant de textures que d'arbres car suivant la position de la caméra chacun des sujets aura un angle propre avec la caméra. Comment gérer le problème surtout dans des scènes comportant beaucoup d'arbres ? Est-ce que quelqu'un a une idée ?

lenogre
29/12/2008, 10h46
Chez moi, je fais comme ça :
J'ai un plan avec ma texture d'arbre et son canal alpha (un seul fichier, pas 360...)
A ce plan, je mets un tag Cible et je décoche Tangage. Dans le champ, je mets la caméra.

Résultat : les arbres pointent tjs vers la caméra et restent tjs verticaux.
Restriction : C'est sûr que si tu te places à la verticale de l'arbre, l'effet sera désastreux mais dans la majorité des cas, c'est suffisant.

user4D
29/12/2008, 12h50
Quelle est la différence entre une texture animé en angle de 360° (technique de Yamp) et un plan unique ciblé vers la caméra (technique de lenogre) ?

ça revient au même non ? :idea:

Sir Gong
29/12/2008, 13h12
En animation, une texture animée à 360° va tourner avec la caméra, regarde l'exemple fait par Oli_D.
Avec une seule texture sur un plan, tu vois toujours la même chose.

Je reste tout de même un peu sceptique, il suffit de changer son éclairage pour que les arbres précalculés ne soient plus raccord, non ?

oli_d
29/12/2008, 14h18
J'ai un plan avec ma texture d'arbre et son canal alpha (un seul fichier, pas 360...)
A ce plan, je mets un tag Cible et je décoche Tangage. Dans le champ, je mets la caméra.

Oui cette technique fonctionne très bien pour les plans fixes, mais pour les animations on voit toujours la même chose, tandis que cette technique permet de donner l'illusion d'un arbre en vrai 3d mais avec des temps de rendu rapides.



Je reste tout de même un peu sceptique, il suffit de changer son éclairage pour que les arbres précalculés ne soient plus raccord, non ?

Pour l'éclairage c'est vrai mais de toute façon je compte inclure dans le script que l'on puisse détecter l'éclairage principal afin de faire correspondre au moins la direction de l'éclairage, mais c'est clair que l'intensité, la couleur et autres ne peuvent pas être modifié.

Je sais que NatFX (générateur d'arbres sur 3Ds et Maya) utilise pour l'ombrage des normalmaps et c'est assez bluffant, mais j'ai encore pas réussi à reproduire le truc.

Je compte également rajouter un plan invisible qui se tourne face à l'éclairage principal pour avoir l'ombre au sol à peu près correcte.

Tengaal
29/12/2008, 14h30
c'est clair que les rendus de l'objet 3D sont précalculés avec un certain éclairage, donc il faut que ce soit cohérent ensuite avec l'éclairage de la scène globale 3D dans lequel l'objet est inséré...

En sachant qu'on peut changer l'orientation de la lumière sur l'objet précalculé en décalant les images par rapport à l'angle de la caméra.

C'est à dire que si la lumière de la scene est à l'opposé de l'éclairage de l'objet précalculé, alors on ajoute 180° à l'angle de la caméra pour pointer sur l'image de l'objet.
(Dans mon hypothese là, je ne parle que de la position de la lumière autour du sujet éclairé, en partant du principe que l'angle vertical de l'éclairage est sensiblement le même, pour un éclairage rasant, on ne pourra pas utilisé un obejt calculé avec une lumière haute bien sûr...)

Par exemple quand la caméra est à 20° alors on ne prendra pas l'image "image_0020.psd" mais l'image 20+180 donc "image_0200.psd"
donc on voit l'objet tourné de 180° donc son éclairage devient cohérent avec la scene globale.
Bien sûr pour que la valeur finale de l'index de l'image soit toujours entre 0 et 359, il faut mettre une condition:

pour résumer simplement avec du pseudo-code,
si on a angle_camera = valeur entière de l'angle de camera Y
et angle_decalage = entre 0 et 359 pour changer l'orientation de la lumiere de l'objet (orientation de tout l'objet en fait)

alors on aura:
index_image = angle_décalage + angle_caméra;
si index_image > 360 alors index_image = index_image - 360; // on garde toujours un angle entre 0 et 359.

l'image à appliquer sera donc "image_"+index_image+".psd"

donc ici on ne change pas les 360 images précalculées ni leur nom, on change juste l'index de l'image associé à la rotation de caméra.

je sais pas si je suis très clair là... :roll:

oli_d
29/12/2008, 15h04
Oui tu es très clair, comme toujours. Pour "caler" l'éclairage c'est pas un problème.

Par contre si j'ai 200 arbres et que je veux tourner autour, chacun aura un angle différents comment faire pour ne pas devoir créer 200 textures différentes ??? :coup:

Est-ce que l'on peut simplement avoir une texture "temporaire" par objet au moment du rendu, là je vois pas encore très clair....

L'autre petit problème que j'ai c'est avec mon plan invisible pour l'ombre, j'aimerais que l'ombre ne se projette pas sur le plan principal (là c'est facile avec un tag de rendu) mais qu'il puisse quand même recevoir l'ombre des autres objets. A ma connaissance avec le tag de rendu on ne peut pas exclure l'ombre reçue d'un objet comme avec la réfraction et compagnie. Me trompe-je?

Je ne sais pas si moi aussi j'ai été clair

Sir Gong
29/12/2008, 15h25
je sais pas si je suis très clair là... :roll:
si, c'est ...lumineux :wink:

NiKo
29/12/2008, 15h45
C'est cool tout ça! Je suis toujours à la recherche de ce genre d'effet pour des projets neccessitant du mattepainting.
Tu pourrai détailler un chouille ta méthode pour arriver à ton résultat Oli-D? J'aimerai faire des essais aussi la-dessus histoire de voir jusqu'où on peut pousser le bouchon... :bounce:

oli_d
29/12/2008, 16h53
Tu pourrai détailler un chouille ta méthode pour arriver à ton résultat Oli-D? J'aimerai faire des essais aussi la-dessus histoire de voir jusqu'où on peut pousser le bouchon... :bounce:


Etape 1 : préparation des 360 images

mettre une caméra alignée sur une spline cercle et l'animer pour qu'elle fasse le tour en 360 frames
activer le rendu multipasse avec masque d'objet + image rvba, ne pas oublier de mettre un tag de rendu sur l'arbre et activer le masque d'objet 1

Etape 2 : préparation de la scène

faire un plan vertical au proportions de l'image, avec un tag pointer vers la caméra, désactiver l'option tangage + un autre tag rendu et activer fond de composition
créer une texture avec dans le canal couleur et dans le canal alpha une des images multipasses
appliquer la texture sur le plan
créer un tag COFFEE sur le plan activer l'option dépendant de la caméra et coller le code ci-dessus à l'intérieur, compiler et exécuter

ensuite petite animation, touchez du bois et lancez le rendu ... si problème ou pas clair ->3615 Oli_d

oli_d
29/12/2008, 17h50
C'est cool tout ça! Je suis toujours à la recherche de ce genre d'effet pour des projets neccessitant du mattepainting.


Vu que tu abordes le sujet, je suis également entrain de développer un plug qui permet de peupler des portions de territoire sur la base d'une carte, d'un modèle de terrain et d'un modèle de surface cela donnera automatiquement ceci :


http://campus.hesge.ch/eil/e-eil/od/fontenette_fdclair.jpg (http://campus.hesge.ch/eil/e-eil/od/fontenette.jpg)

agrandissage = clickage/image
je détaillerai prochainement quand ce sera vraiment au point

Bon j'arrête de monopoliser ton sujet Ohliv !

NiKo
29/12/2008, 18h11
Ah yes, joli! C'est de l'extrusion à partir d'une image verticale?
Si ta manip des arbres fonctionne à cette échelle et de ce point de vue, l'effet réalisme est garanti! :poucehaut:

oli_d
30/12/2008, 07h01
Ah yes, joli! C'est de l'extrusion à partir d'une image verticale?


l'image verticale sert de texture au modèle de terrain et aux toits des bâtiments, pour la végétation on isole les zones ou l'on a une différence entre le modèle de terrain (relevé laser du sol uniquement) et le modèle de surface (relevé laser avec végétation et bâtiments). On enlève de cette carte les zones bâties d'après des données cadastrales.

Il reste alors une carte de la végétation en 2D. D'après cette carte j'ai écrit un plug qui génère des bildboards d'arbres, qui sont posés sur le modèle de terrain et leur hauteur est calculée d'après le modèle de surface.

oli_d
30/12/2008, 08h51
Dernière petite animation :

http://campus.hesge.ch/eil/e-eil/od/test4.mov

Cette fois avec les ombres :

Duppliquer le plan principal, enlever le tag COFFEE et le tag pointer vers la caméra.

Mettre un tag xpresso où l'on récupère l'angle H de la lumière que l'on transmet en additionnant 3.14 (90°) à l'angle de rotation H de ce second plan.

Dans le tag de rendu désactiver tout sauf l'ombre portée et pour l'autre plan désactiver ombre reçue pour que les ombres n'agissent pas sur l'image.

Pour ceux que ça intéresse le fichier (sans les 360 images, ça ferait un peu lourd!!!):http://campus.hesge.ch/eil/e-eil/od/bildboard.zip

Edit

Ohliv
30/12/2008, 11h41
Bon j'arrête de monopoliser ton sujet Ohliv !


Mais non, t'es fou ! continues !!!
C'est énorme ce que t'as réussi à faire. Je n'ai pas encore eu le temps d'aller voir ton fichier et ça risque d'être chaud de m'y coller avant le 1er Janvier mais je suis impatient de tester tout ça.
1 arbre = 1 polygone, ça laisse rêveur pour les anims d'archi :poucehaut: Merci encore :prie:

base80
31/12/2008, 05h29
3.14 (90°)
3.141592= π(pi)
un tour = 2π(pi)
un demi tour = 1π(pi)
mais un quart de tour (90˚) ne fat que la moitié d'un pi(π)
c'est du ∏∏

oli_d
31/12/2008, 06h38
3.14 (90°)
mais un quart de tour (90˚) ne fat que la moitié d'un pi(π)


Bon j'ai été un peu vite sur ce coup là, mais c'était juste pour montrer que j'arrivais à mettre plus de deux p'tites boites dans un Xpresso. :mrgreen:

J'édite et je corrige le fichier joint

Merci base

Rink
31/12/2008, 08h23
Un gros bravo messieurs pour ces recherches, :efface:

oli_d tu vas toujours chercher où il faut, au bon moment.
Ta mise en volume a partir de la carte, donne déjà une idée du potentiel.

NiKo
31/12/2008, 14h49
Top ta dernière anim.
Tu pourrai nous donner une indication sur le temps de rendu pour cette anim?

Et éventuellement le temps qu'il te faut pour paramétrer un 360° d'un arbre et le setuper dans une scène, histoire de voir si des fois la manip ne prendrai pas plus de temps au final qu'un rendu full 3D bourrin ;-)

Yamp
31/12/2008, 16h09
Dans mon cas, pour la préparation des 360 textures d'un arbre : 5 minutes, et pour
l'animation complète avec quelques arbres : 30 minutes.

http://www.jcuadras-arquitecto.com/AnimacionesC4d/Animacion120.html

http://www.jcuadras-arquitecto.com/AnimacionesC4d/Animacion119.html

xander
31/12/2008, 21h12
Je suis ce sujet avec intéret . :prie:

oli_d
03/01/2009, 09h41
Tu pourrai nous donner une indication sur le temps de rendu pour cette anim?


Pour la préparation de la texture 360, pour un arbre de 230'000 polygones (bibliothèque Xfrog) une résolution de 1024x950 px avec éclairage simple à 3 points, ombres diffuses masque ombre à 1000x1000 un peu plus d'une heure (j'ai mis le paquet sur les pixels pour pouvoir la réutiliser par la suite, mais c'est clair que dans ce cas j'aurais pu baisser fortement la résolution)

Pour l'animation 100 frames en 640x480 éclairage idem que texture environ 3 minutes !

Le gros avantage c'est que l'on peut préparer les textures une bonne fois pour toute, et surtout avant la charette du rendu final et là on gagne un temps précieux.

L'inconvénient c'est que l'on a pas d'ombres reçues par l'arbre, et il faut faire attention que l'éclairage soit cohérent par rapport au pré-calcul.

L'autre inconvénient c'est la place des 360 images sur le disque dur !

manu_Edna
28/07/2009, 14h37
Bonjour tout le monde

Je suis en stage dans une boite d'archi et je bosse sur un projet avec beaucoup d'arbres . Ainsi je pense que la technique cité dans ce fil conviendrait parfaitement a ce projet car très faible en polygone. Mais malgré mon acharnement et plusieurs essai je n'y arrive toujours pas.... :cry2:

Tout d'abord j'ai créer un arbre avec le plug Dpit puis j'ai réaliser 360 images de cet arbre avec une camera et rendu en multipasse: arbre_001_0000, arbre_001_0001, arbre_001_0002...

Apres je me suis permis de reprendre la scène de Oli_D ( http://campus.hesge.ch/eil/e-eil/od/bildboard.zip ) . Dans l'éditeur de matériau, je met le fichier arbre_001_0000 dans le canal Couleur et pareil pour le canal Alpha.

Le problème c'est que des que je lance le rendu je me retrouve avec des erreurs de texture :
http://turing.lecolededesign.com/emdurand/FC4D/Image%202.png

A mon avis je pense qu'il fy un conflit avec le code COFFEE....

Quelqu'un aurait il un avis car cela fait depuis hier que je bute dessus... :coup:

Merci beaucoup

Manu