PDA

Voir la version complète : texturer une extrusion controlée régulièrement



Karl315
14/02/2013, 13h15
Bonjour,
Dans mes projets, j'ai souvent le même problème :
j'utilise pas mal les extrusions controlées, en galérant plus ou moins avec les doubles rails et autres subtilités dues au sens des splines,
et j'en fais souvent avec pour chemin une spline constituée de plusieurs segments, parfois non jointifs
(par exemple, une spline pour le contour des trottoirs de plusieurs ilots, ou des balcons filants sur un immeuble, mais pas tous de la même longueur )
et là, pb : le texturage uvw d'une extrusion controlée s'adapte automatiquement à la longueur du chemin de chaque tronçon, et non à l'ensemble de l'extrusion, ce qui fait que ma texture n'est pas uniforme sur tous mes balcons, ce qui m'oblige faire une extrusion controlée par balcon et ajuster à chaque fois ma tex, ce qui ne plait pas du tout !
y a t il un moyen d'uniformiser ce mapping ?
et deuxième problème, pareil en fonction de la subdivison du profil, (voir image)
(ce qui m'a bien pris la tete pour faire du carrelage dans des couloirs de métro avec des angles arrondis)
alors on est obilgés de redécouper chaque segment du contour, pour qu'il ait à peu près la même dimension que les autres, c'est vraiment nul ..
merci si qqun connait le réglage magique que je n'ai pas trouvé !

Aurety
14/02/2013, 13h59
Récupère la longueur de la spline concernée et une simple division par Xpresso pour créer un ratio que tu appliques à ton echiquier U ou V via Xpresso..

6984

Karl315
14/02/2013, 16h02
ah merci auréty,
le seul hic que je ne comprends absolument rien à xpresso, c'est du chinois pour moi !
en plus si il faut faire le truc pour chaque texture du matériau, ça me parait chaud,
+ mesurer la spline, si je la bouge, recommencer ..
c'est trop pour moi
j'espérais qu'il y avait un paramètre cool que j'aurais zappé ...
enfin si personne ne connait un truc, je serai bien obligé de mettre le nez ds xpresso !

Aurety
14/02/2013, 16h42
Quand je dis récupère la longueur de la spline, c'est via xpresso, tu n'as pas à le faire à chaque fois.. Par contre là où ça marche dans mon exemple en me basant sur une texture échiquier ( et donc en jouant sur la fréquence U ou V ), ça foire en me basant sur une image car je dois passer par le paramêtre de longueur X ou Y de la propriété de projection.. Hors si j'utilise le facteur de longueur ca ne marche plus.. Faut que je réfléchisse un peu à la question.. Comment ont fait pour récuperer par Xpresso la résolution d'une image ?? :huh:

Sir Gong
14/02/2013, 18h23
Faut que je réfléchisse un peu à la question.. Comment ont fait pour récuperer par Xpresso la résolution d'une image ?? :huh:
Je suis sans doute le moins bien placé pour essayer de répondre, mais peut-être avec une simple règle de trois ?
Sachant que taille / dpi / nbre de pixels sont reliés...

tabou
14/02/2013, 19h42
Pas besoin de sortir la calculette, il y a le nœud image bitmap qui donne la largeur et la hauteur, en pixels, de l'image référencée en entrée :icon_thumbsup:

Sir Gong
14/02/2013, 20h20
j'allais le dire... :icon_mrgreen:

Fluffy
14/02/2013, 23h35
Tu peux tout simplement ajuster l'échelle de la projection UV sur un des axes, à l'oeil, en sélectionnant le tag et en ajustant jusqu'à satisfaction.

Aurety
15/02/2013, 01h34
Oui mais c'est justement cette approximation qu'il trouve pénible Fluffy..

Mais comme le dit Tabou, Karl... avec le noeud Bitmap qui retourne la largeur/hauteur de l'image, c'est plus facile d'automatiser un process..
Du coup, j'ai un peu joué pour pondre un petit fichier sympa avec profil, chemin et autre option pilotable via DU que je me propose de t'expliquer en vidéo demain, afin que tu mettes un peu les pieds dans XPresso :icon_mrgreen:

6991

catrax
15/02/2013, 06h47
Interessant , moi je me paluche le truc a la main jusqu'à avoir le résultat souhaiter, ais ce n'est pas parfait.

Sir Gong
15/02/2013, 08h42
Un peu comme ton orthographe.

"ais ce n'est pas parfait" faut aller le chercher quand même.

Une relecture avant de poster, pour le confort de nos yeux, stp ? merci d'avance :kiss:

Karl315
15/02/2013, 10h18
ah, merci pour toutes vos réponses !
aurety, voilà, c'est exactement le genre de truc que je veux faire, ces caniveaux !
en revanche mon problème n'est pas le calage de la texture à la main,
mais bien la différence de proportions de mapping entre des segments de taille différentes ..
en attendant, si tu veux bien partager ton fichier, je promets à genoux de regarder un peu comment fonctionne xpresso
(mais malgré ma bonne volonté, j'y suis complètement hermétique j'en ai peur ..)
pendant qu'on y est, j'ai ausi un autre bug de rendu sur mes extrusions controlées, au niveau du rendu de la texture (ou juste du bump, je ne me rends pas trop compte ?)
pour y remédier, il faut que je redécoupe ma spline chemin
(sir gong, tu postes vraiment à 5h42 du matin ?!°)

Sir Gong
15/02/2013, 11h31
(sir gong, tu postes vraiment à 5h42 du matin ?!°)non, 8h42.

Aurety
19/02/2013, 12h14
Comme promis, le petit tutorial pour faire en sorte que quelque soit la longueur du chemin de l'extrusion, on puisse répeter de façon régulière une texture. Désolé pour le retard.. :blush:


http://vimeo.com/59976629

Karl315
19/02/2013, 14h18
aurety merci bcp,
je vais faire ton truc..
xpresso a l'air vraiment super puissant je suis sur qu'il y a plein de situations ou il doit être magique,
faut vraiment que je m'y mette
je vais commencer par ce tuto
merci !

xs_yann
19/02/2013, 23h50
Salut,

Merci pour le partage Aurety.

Je me suis amusé à transformer ton Xpresso en script, ça n'apporte pas grand chose mais je le poste quand même.
La version Tag Python à placer sur l'extrusion :

import c4d

def adaptTexture(sweep, size=0, tiles=0):
tag = sweep.GetTag(c4d.Ttexture)
mat = tag[c4d.TEXTURETAG_MATERIAL]
shader = mat[c4d.MATERIAL_COLOR_SHADER]
irs = c4d.modules.render.InitRenderStruct()
if shader.InitRender(irs) == c4d.INITRENDERRESULT_OK:
bitmap = shader.GetBitmap()
shader.FreeRender()
height = bitmap.GetBh()
spline = sweep.GetDown().GetNext()
sld = c4d.utils.SplineLengthData()
sld.Init(spline.GetRealSpline())
length = sld.GetLength()
if size:
tiles = height / float(size)
tag[c4d.TEXTURETAG_LENGTHY] = (height / length) / tiles

def main():
sweep = op.GetObject()
adaptTexture(sweep, size=200)

La version script à copier dans le Script Manager (s'applique sur tous les objects sélectionnés) :


import c4d

def adaptTexture(sweep, size=0, tiles=0):
...

def main():
objects = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_0)
for object in objects:
if object.CheckType(c4d.Osweep):
adaptTexture(object, size=200)
c4d.EventAdd(c4d.EVENT_0)

if __name__=='__main__':
main()

Ça s'utilise soit en donnant un nombre de répétition (comme dans l'Xpresso) : adaptTexture(object, tiles=4),
soit en choisissant la taille d'une répétition : adaptTexture(object, size=200)

J'ai volontairement omis la gestion d'erreur pour faire plus court.

lenogre
20/02/2013, 00h28
Merci pour le tut', c'est le genre de pb qu'on a tous déjà eu !

Aurety
20/02/2013, 02h16
merci Lenogre !
Yann, super merci !! moi qui me colle doucement à Python, c'est le genre de script super intéressant pour moi car il me permet de bien visualiser le passage d'XPresso vers du code. C'est inestimable :icon_love:
J'adore le forum quand il fonctionne comme ça ! :icon_clap:

Fluffy
20/02/2013, 02h58
Merci pour le tuto et script, les gars. Très bonne technique, et bon moyen d'apprentissage du script!

Aurety
20/02/2013, 09h28
XS_Yann, j'arrive pas à faire fonctionner ton script python :icon_redface:

à quoi correspond le Ttexture dans cette partie du code ?

tag = sweep.GetTag(c4d.Ttexture)J'ai pas d'erreur sur le script mais quand je tente de saisir d''autres valeurs que 0, rien ne se passe. :huh:

EDIT : Oups ! ça marche ! J'éditais la mauvaise ligne !!

valkaari
20/02/2013, 18h38
Juste pour répondre à la dernière question la fonction GetTag veut un paramètre en entrée pour lui indiquer le type de tag à aller chercher.

c4d.Ttexture correspond donc à l'ID' du tag texture. (5616)

Si tu tapes dans la console c4d.Ttexture il vas te donner le chiffre 5616.
Si tu glisses un tag texture dans le champ de la console et que tu valides il vas te donner quelques info et également te mettre "with ID 5616"

La fonction vas donc parcourir les tag et dès qu'elle en voit un avec cet ID elle te donne le "pointeur" (de type baseTag) vers le/les tags en question.

xs_yann
20/02/2013, 21h16
La fonction vas donc parcourir les tag et dès qu'elle en voit un avec cet ID elle te donne le "pointeur" (de type baseTag) vers le/les tags en question.

Et même plus précisément le premier tag du type passé en paramètre ou celui à l'index passé en deuxième paramètre :

Prototype : BaseObject.GetTag(type[, nr=0])
op.GetTag(c4d.Ttexture, 1) = le deuxième tag texture.

Pour les ids j'avais un peu expliqué comment les trouver dans ce post : http://frenchcinema4d.fr/showthread.php?75724-modifier-les-reglages-de-Vray-en-python&p=1002012&viewfull=1#post1002012

Et bien sûr les listes de types du SDK qu'on trouve dans les constructeurs (__init__) des classes type BaseObject, BaseTag, etc.

valkaari
20/02/2013, 23h03
oupsss vi ^^