Explicit rotation/orient control for copy and instances

 I breeze over this in a few examples on this page, probably worth writing it down as it's a common question, and used so often.


Both the instancer and the copy sop look for certain attributes on incoming points, with a certain order of precidence, listed on the following page:


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


Celui qui a la priorité est @orient, et c’est celui que j’ai fini par utiliser par défaut.


Orient devrait être un quaternion (un vecteur de 4 valeurs), qui ont tendance à être plus stables que les valeurs d’Euler (aucun risque de verrouillage de gimble ou de retournement d’Euler). Les quaternions sont difficiles à manipuler à la main, heureusement que nous n’en avons pas besoin.


Une matrice de transformation peut être convertie en quaternion et in arrière très facilement, ce qui est légèrement plus facile à modifier 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, donc c’est ce par quoi je commence, et j’utilise des appels vex pour convertir cela en matrice, puis en quaternion. Plus facile qu’il n’y paraît.


Par exemple, disons que vous avez un plan de masse plat et que vous souhaitez disperser de nombreuses copies d’un arbre, chacune avec une rotation aléatoire autour de l’axe des y. Voici ce que j’ai mis dans une querelle de point avant le sop de copie:


float angle = rand(@ptnum) * 360;
angle = radians(angle);
vector axis = {0,1,0};
matrix3 m = ident();

rotate(m, angle, axis);

@orient = quaternion(m);


En décomposant cela ligne par ligne:



 float angle = 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, alors multipliez-la par 360 pour obtenir une plage de mouvement complète.


angle = radians(angle);


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



vector axis = {0,1,0};


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


matrix3 m = ident();


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


 rotate(m, angle, axis);


Cette fonction applique l’angle de rotation autour du vecteur 'axis' à la matrice 'm'. C’est-à-dire que « m » est maintenant tourné. Notez que vous n’avez pas besoin de l’assigner, la rotation se fait directement à m.


 @orient = quaternion(m);


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


Simple non?


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


p@myvalue


'p' est l’abréviation de 'pbail dites-moi pourquoi c’est p et non q'. Je pense.


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


De plus, je ne l’écrirais généralement pas proprement, il y avait des lignes combinées, et j’ajouterais probablement des canaux afin d’obtenir des curseurs pour conduire tout le shebang. Je serais probablement super paresseux et utiliser @attrs pour tout, cos taper 'type foo = blah' est ennuyeux. Eg:






@angle = radians( rand(@ptnum)* ch('range'));
v@axis = chv('axis');
matrix3 m = ident();
rotate(m, @angle, @axis);
@orient = quaternion(m);


Enregistrez cela comme un préréglage, blam. Cela dit, je ne l’ai toujours pas enregistré en tant que préréglage; me faire taper à chaque fois me force à me souvenir d’un peu de vex, et c’est bien.




0 Commentaires