Contrôle de rotation

 

Contrôle de rotation/orientation explicite pour la copie et les instances

Je résume cela dans quelques exemples sur cette page, ce qui vaut probablement la peine de l'écrire car c'est une question courante et utilisée si souvent.

L'instancer et le copy sop recherchent tous deux certains attributs sur les points entrants, avec un certain ordre de priorité, répertoriés sur la page suivante :

http://www.sidefx.com/docs/houdini15.0/copy/instanceattrs

Celui qui a la priorité est @orient, et c'est celui que j'utilise par défaut.

On s'attend à ce que Orient soit un quaternion (un vecteur à 4 valeurs), qui a tendance à être plus stable que les valeurs euler (pas de risque de verrouillage gimble ou de retournement euler). Les quaternions sont difficiles à manipuler à la main, heureusement nous n'en avons pas besoin.

Une matrice de transformation peut être convertie en un quaternion et inversement très facilement, ce qui est légèrement plus facile à éditer qu'un quaternion (c'est-à-dire toujours pas très facile à éditer).

Une rotation autour d'un axe est agréable et intuitive pour les humains, c'est donc ce que je commence, et j'utilise des appels vex pour convertir cela en une matrice, puis en un quaternion. Plus facile qu'il n'y paraît.

Par exemple, supposons que vous ayez un plan de sol plat et que vous souhaitiez disperser de nombreuses copies d'un arbre, chacune avec une rotation aléatoire autour de l'axe y. Voici ce que j'ai mis dans une querelle de points avant la copie:

 angle  flottant =  rand ( @ ptnum )  *  360 ; 
angle  =  radians ( angle ); 
axe vectoriel  = { 0 , 1 , 0 } ; matrice3 m = ident ();  
   

tourner ( m ,  angle ,  axe );

@ orient  =  quaternion ( m );


Décomposant cela ligne par ligne:

angle flottant = rand(@ptnum) * 360 ;

Définissez une variable 'angle', obtenez un nombre aléatoire en utilisant le point-id comme graine. rand() renvoie une valeur comprise entre 0 et 1, multipliez-la donc par 360 pour obtenir une amplitude de mouvement complète.

angle = radians(angle);

Convertissez l'angle en radians, attendu par la commande 'rotate' plus tard.

axe vectoriel = {0,1,0} ;

L'axe autour duquel nous allons tourner, c'est-à-dire l'axe Y. Souvent, lors de la diffusion sur la géo, vous pouvez utiliser la normale à la place (par exemple, axe vectoriel = @N; ).

matrice3 m = ident();

Créez une variable matricielle 'm', ident() renvoie une matrice de transformation propre, c'est-à-dire faire pivoter et translater 0, échelle 1. Un type 'matrice3' est une matrice de transformation, une matrice 'matrice', c'est-à-dire une matrice 4x4, comprend des éléments supplémentaires pour faire face au cisaillement et à la transformation de la perspective, dont nous n'avons pas besoin.

rotation(m, angle, axe);

Cette fonction applique la rotation 'angle' autour du vecteur 'axe' à la matrice 'm'. C'est-à-dire que 'm' est maintenant tourné. Notez que vous n'avez pas à l'affecter, la rotation se fait directement sur m.

@orient = quaternion(m);

Créez l'attribut 'orient', convertissez la matrice 'm' en un quaternion, affectez-le à orient.

Simple non ?

Bon, quelques mises en garde. Tout d'abord, pour définir un attribut quaternion dans un wrangle, vous avez généralement besoin du préfixe 'p' pour indiquer au wrangle que cet attribut doit être un vecteur à 4 valeurs :

p@mavaleur

'p' est l'abréviation de ' p bail dis moi pourquoi c'est p et pas q' . Je pense.

Mais @orient, comme @P, @N, @Cd, etc. sont spéciaux , les conflits savent ce qu'ils sont et ce qu'ils devraient être, vous pouvez donc ignorer la définition de type.

De plus, je ne l'écrirais généralement pas aussi proprement, il y aurait des lignes combinées, et j'ajouterais probablement des canaux pour que j'obtienne des curseurs pour piloter tout le shebang. Je serais probablement super paresseux et utiliserais @attrs pour tout, car taper "type foo = blah" est ennuyeux. Par exemple:

@ angle  =  radians (  rand ( @ ptnum ) *  ch ( 'plage' )); 
v @ axe  =  chv ( 'axe' ); 
matrice3  m  =  ident (); 
tourner ( m ,  @ angle ,  @ axe ); 
@ orient  =  quaternion ( m );


Enregistrez cela en tant que préréglage, blam. Cela dit, je ne l'ai toujours pas enregistré en tant que préréglage ; me forcer à le taper à chaque fois m'oblige à me souvenir de certains vex, et c'est tant mieux.

0 Commentaires