PDA

Voir la version complète : feuillage et multishader



Karl315
27/11/2012, 15h35
Bonjour,
j’enchaîne depuis ce matin les rubriques d'aide, forum et tutos, mais je ne trouve pas la solution à mon problème
je suis pourtant sur qu'elle est très simple :
sur des arbres archmodel, comment faire pour varier la teinte des feuilles ?
(sachant qu'il s'agit d'un seul maillage avec toutes les feuilles dessus )
j'essaie avec un objet fracture + multi shader de mograph mais je dois mal le paramétrer, impossible d'y arriver
ça marche très bien sur un feuillage simple, mais qu'il devient un peu plus complexe, je crois que l'objet fracture ne gère plus,
tout disparait
qqun connait il une autre méthode pour avoir l'équivalent du "material by element " de max ?

Aurety
27/11/2012, 16h31
Un petit test vite fait sur un modele d'ananassier ( :icon_arg: ), un arbre qui produit des ananas, quoi... que j'avais comme modele issu des Archmodels.

Alors effectivement toutes les feuilles sont sur un même objet, alors la première chose que j'ai fait, c'est de singulariser chaque feuille pour les mettres dans l'objet Fracture. Désolé mais pour ça j'ai utilisé le plugin Morphmill de Spanki qui est payant, pas trouvé le moyen de faire un "split by group" ou " split by connected" directement dans Cinema 4D. Un petit développeur dans le coin ? :whistling:

Bref je me retrouve enfin avec toutes mes feuilles texturées par la même texture dans mon objet fracture.
Sur cette texture, je rajoute en mode "calque" ou "fusion" une matière couleur Mograph que je met pour tester en mode produit. Reste juste à sélectionner ma fracture et lui ajouter un effecteur randomisation, je désactive les paramêtres de transformation de position et j'active la couleur. Bingo ça marche ! :icon_boss:

6466

Karl315
27/11/2012, 16h54
salut aurety,
merci de ta réponse
je ne connaissais pas morrphmill, qui a l'air intéressant,
cepandant, vois la tete de mon arbre ,
est on vraiment obligé de passer par une individualisation des feuilles ?!
(210000 polys = 105000 feuilles qd même ..!)
fracture, qui fonctionne sur une petite branche, sans individualiser les feuilles, et donc avec un seul maillage,
ne fonctionne pas sur qque chose d'aussi gros ..

j'avais oublié la pj !
(en fait je voudrais d'ailleurs surtout pouvoir affecter des materiaux différents aux feuilles pour pouvoir faire disparaitre des feuilles, justement,
en mettant un matériau transparent sur certaines d'entre elles..)

Aurety
27/11/2012, 16h57
ouais ! c'est la misère !! :icon_frown:

oli_d
27/11/2012, 19h14
Salut,

J'avais fait un petit script qui applique aléatoirement toutes les texures sélectionnées sur des polygones de l'objet selectionné.



import c4d
import random

"""Pour appliquer aléatoirement les materiaux sélectionnés
sur les polygones de l'objet sélectionné
en créant autant de tagSelection que de materiaux"""

def main():

materials = doc.GetActiveMaterials()
NB=len(materials)
lst_bs = []
for i in xrange(NB):
tgSel = c4d.SelectionTag(c4d.Tpolygonselection)
name = str(i+1)
tgSel.SetName(name)
op.InsertTag(tgSel)

tgTex = c4d.BaseTag(c4d.Ttexture)
tgTex[c4d.TEXTURETAG_MATERIAL]= materials[i]
tgTex[c4d.TEXTURETAG_RESTRICTION]=name
tgTex[c4d.TEXTURETAG_PROJECTION]=6#projection UVW
op.InsertTag(tgTex)

bs = tgSel.GetBaseSelect()
lst_bs.append(bs)


for i in xrange(op.GetPolygonCount()):
bs = random.choice(lst_bs)
bs.Select(i)

op.Message(c4d.MSG_UPDATE)
c4d.EventAdd()





if __name__=='__main__':
main()

EDIT : j'ai oublié de dire que c'est du python à coller dans le menu scripts/gestionnaire de scripts sous l'onglet python puis bouton exécuter

oli_d
28/11/2012, 06h57
Je n'avais pas vu que tes feuilles avaient plusieurs polys chacune.

Le script ci-dessous tient compte des polygones connectés, le principe reste le même sélectionner d'abord les textures que l'on veut appliquer puis l'objet polygonal contenant les feuilles.


J'ai testé sur un arbre provenant d'arbaro, ça à l'air de fonctionner pas trop mal. Par contre c'est pas optimisé du tout, donc quand il y a beaucoup de polys il faut être très patient ...


import c4d
import random

"""Pour appliquer aléatoirement les materiaux sélectionnés
sur les polygones de l'objet sélectionné en tenant compte des connections
en créant autant de tagSelection que de materiaux"""

def getPointsPolysConnected(op,id_pt,nb=None):
"""renvoie un tuple avec la liste des points connectes et la liste des polygones connectes
au point id_pt
nb est le Neighbor si non renseigne sera initialise"""

if not nb :
nb = c4d.utils.Neighbor()
nb.Init(op)

points = [id_pt]
polys_id = []
points_traites = []

while len(points):
#on prend le premier point en le supprimant de la liste
id_pt = points.pop(0)
#qu'on rajoute a la liste des point traites
points_traites.append(id_pt)
#polygones relies au point
polys =nb.GetPointPolys(id_pt)
for p in polys :
if p not in polys_id : polys_id.append(p)
poly = op.GetPolygon(p)
if poly.a not in points and poly.a not in points_traites:
points.append(poly.a)
if poly.b not in points and poly.b not in points_traites:
points.append(poly.b)
if poly.c not in points and poly.c not in points_traites:
points.append(poly.c)
if poly.d not in points and poly.d not in points_traites:
points.append(poly.d)
return (points_traites,polys_id)

def main():

materials = doc.GetActiveMaterials()
NB=len(materials)
lst_bs = []
for i in xrange(NB):
tgSel = c4d.SelectionTag(c4d.Tpolygonselection)
name = str(i+1)
tgSel.SetName(name)
op.InsertTag(tgSel)

tgTex = c4d.BaseTag(c4d.Ttexture)
tgTex[c4d.TEXTURETAG_MATERIAL]= materials[i]
tgTex[c4d.TEXTURETAG_RESTRICTION]=name
tgTex[c4d.TEXTURETAG_PROJECTION]=c4d.TEXTURETAG_PROJECTION_UVW
op.InsertTag(tgTex)

bs = tgSel.GetBaseSelect()
lst_bs.append(bs)

nb = c4d.utils.Neighbor()
nb.Init(op)

pts_id = range(op.GetPointCount())

while len(pts_id):
id = pts_id[0]
pts,polys = getPointsPolysConnected(op,id,nb)
bs = random.choice(lst_bs)
[bs.Select(i) for i in polys]
[pts_id.remove(i) for i in pts]

op.Message(c4d.MSG_UPDATE)
c4d.EventAdd()





if __name__=='__main__':
main()

Aurety
28/11/2012, 09h20
Oli, puisque tu as récupéré les polygones connectés, tu as un moyen simple de faire un "split_by_group" ou "split_by_connected" :icon_mrgreen:

Mon plugin le fait trés bien mais c'est une fonction qui pourrait-être utile à d'autres :icon_wavey:

valkaari
28/11/2012, 11h57
en passant comme ça, je comprends pas trop pourquoi le fracture en mode "explode segment" ne convient pas ou la commande "polygon group to object"

Aurety
28/11/2012, 12h15
bhein le mode explode segment marche visiblement mal, même sur mon ananassier qui est moins gourmand niveau ressource n'était pas rendu et disparaissait, un bug ?
Pour la fonction "polygon group to object" , je savais qu'elle existait dans les anciennes versions mais ne la voyant plus dans les menus, j'ai douté. Maintenant effectivement elle est présente dans le gestionnaire de commande. Merci Val :sweatdrop:

valkaari
28/11/2012, 15h37
mesh-> convertion (je mets toujours 3 plombe à la trouver aussi)

C'est vrai que le fracture est lent de toute façon avec pleins de "group" j'ai pas testé depuis longtemps je sais pas pour le bug.


SInon y a paul everett qui a fait un plugins pour ce genre de choses aussi http://www.tools4d.com/?p=3235

qui fait parti de son kit de remapping.

Karl315
29/11/2012, 10h46
merci pour vos réponses
oli ton script est top et marche super bien des maillages un peu balèzes, mais pas trop non plus quand même :
j'ai mis 5 min à appliquer 3 textures sur un maillage de 530000 polys..
mais ça marche qd même !
pour le plug de everett, je l'avais repéré mais je voulais être sur qu'il n'y avait pas un moyen de faire sans
en plus je pense quil y a un problème, c'est qu'il a l'air de fonctionner avec un objet fracture
qui est en mode explode segments, donc impossible sur gros maillage ..
pour l'instant je garde le script
merci oli !