Notes concernant Houdini
Créer des points à partir de rien
- Créer un nœud
Attribute Wrangle
(dans le sous-menuAttribute
). - Mettre
Run Over
àDetail (only once)
. - Coller le code suivant :
int geo = geoself();
// Default transform.
addpointattrib(geo, "transform", {{1.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0},
{0.0, 0.0, 0.0, 1.0}});
int p0 = addpoint(geo, {0, 0, 0});
int p1 = addpoint(geo, {0.5, 0, 0});
setpointattrib(geo, "transform", p1, {{1.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0},
{0.0, 0.0, 0.0, 1.0}});
// ...
Les commandes addpointattrib
et setpointattrib
permettent respectivement d’ajouter un attribut par défaut et de le définir sur un point.
Ces points peuvent alors servir d’inputs au nœud Copy to Points
.
Plus d’informations :
Assemblage de décor
Voici une méthode pour assembler un décor complexe.
Il faut utiliser trois nœuds :
sources
: L’ensemble de sources unique (souvent des props) ; arbre, chaise, etc.points
: L’ensemble de points avec une transform et un index de source.copytopoints1
: La logique de combinaison des deux ; l’attributasset_id
, que nous verrons plus loin.
Les sources
Dans le nœud sources
on retrouve un ensemble de sources connecté à un nœud de sorti.
Chaque source n’est amené qu’une seule fois. Par exemple, l’Alembic de l’asset grandArbre
ne sera importé qu’une fois, même si cet asset est présent plusieurs fois dans le décor. C’est le copy to points qui se chargera d’instancier les arbres autant de fois que nécessaire.
Chaque source est composée de trois nœuds :
- L’Alembic (dont on a supprimé l’attribut
path
). - Un pack pour simplifier les primitives Alembic.
- Un attribute create pour créer l’attribut
asset_id
de type Integer avec sa valeur correspondant à l’id
de l’asset représenté par l’Alembic (ici,449
).
L’ensemble est rassemblé dans le nœud merge
:
La Geometry Spreadsheet de ce nœud ressemble à :
Nous avons bien un point (représentant l’Alembic packé) par asset, chaque point ayant un asset_id
qui lui est propre.
Les points
Ici, le nœud points
est un Attribute Wrangle exécuté une seule fois (paramètre Run Over à Detail (only once)) :
Le code qu’il contient génère tous les points et les attributs nécessaires :
int geo = geoself();
// Default attributes.
addpointattrib(geo, "transform", {
{1.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0},
{0.0, 0.0, 0.0, 1.0}
});
addpointattrib(geo, "asset_id", 0);
matrix xforms[] = {
{{0.179149, 0.147086, -0.972765, 0.0}, {-0.0255408, 0.989123, 0.144856, 0.0}, {0.98349, -0.00110568, 0.180957, 0.0}, {-86.8072, 26.6117, 12.5686, 1.0}},
...
{{-0.856446, -0.0135429, 0.516059, 0.0}, {-0.0224544, 0.999687, -0.0110305, 0.0}, {-0.515748, -0.0210348, -0.856482, 0.0}, {-44.1047, 33.9236, -57.943, 1.0}},
};
int asset_ids[] = {
648,
...
2788,
};
for (int i=0; i<len(xforms); i++) {
int p = addpoint(geo,{0,0,0});
setpointattrib(geo, "transform", p, xforms[i]);
setpointattrib(geo, "asset_id", p, asset_ids[i]);
}
Pour information, ce code est généré par un template au moment de l’assemblage, et le contenu des deux tableaux est modifié par un script qui ne fait que du search and replace des tableaux pour les remplir avec les informations à jour.
Ce code est composé de trois parties :
- La définition des attributs par défaut.
- L’énumération de deux tableaux de même taille ;
xforms
etasset_ids
. - Une boucle fabriquant les points dans Houdini avec, respectivement l’attribut
transform
etasset_id
appliqué sur chacun d’eux.
La Geometry Spreadsheet de ce nœud ressemble à :
Ici, c’est l’attribut transform
qui est choisi, mais l’orientation des points pourrait se faire avec l’attribut orient
. Plus d’information ici.
Notez que ces points peuvent être créés d’une tout autre façon (il peut s’agir d’un Alembic), l’important étant qu’ils aient une orientation et un asset_id
cohérent.
Placement des sources sur les points
Le placement des sources sur les points se fait via le nœud Copy To Points en Pack and Instance et dont le Piece Attribute est activé et sur asset_id
:
C’est le paramètre Piece Attribute qui permet de faire une relation entre la source à utiliser et les points qui l’utilisent. Plus d’information ici
Ghosting des objets
Par défaut, l’option de ghosting des objets est activée (Ghost Other Objects) :
Cela veut dire que les objets voisins d’un nœud restent visibles (transparents) quand on est dans ce dernier.
Quand on travaille avec de gros décors, cela peut alourdir l’affichage (voir le rendre instable). Il ne faut pas hésiter à le désactiver (Hide Other Objects, ou le raccourcie-clavier « Y »).
Dernière mise à jour : mer. 12 mai 2021