Notes concernant Houdini

Créer des points à partir de rien

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 :

Houdini assemble general

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.

Houdini assemble source 001

Houdini assemble source 002

Houdini assemble source 003

Chaque source est composée de trois nœuds :

Houdini assemble source 004

Houdini assemble source 004

L’ensemble est rassemblé dans le nœud merge :

Houdini assemble source merge

La Geometry Spreadsheet de ce nœud ressemble à :

Houdini assemble source merge geo spreadsheet

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)) :

Houdini assemble points

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 Geometry Spreadsheet de ce nœud ressemble à :

Houdini assemble points geo spreadsheet

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 :

Houdini assemble copy to points

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

Dernière mise à jour : mer. 27 janvier 2021