- Allez chercher le fichier ici: https://drive.google.com/file/d/1egIiBe2CITLGio_DKGRpxmP6gYiuU9RN/view?usp=sharing
- Ok, il y a un parapluie et on aimerait que la pluie de points entre en collision avec le parapluie.
- Remarquez que le parapluie est dans une collection nommée “Low poly umbrella”
- Ajouter un noeud “Collection info” dans la section Geo nodes.
- Choisir la collection du parapluie et choisir Relative au lieu d’Original (on veut la position relative au monde, pas la position locale).
- Ajouter un noeud Realize Instance. C’est la géométrie du parapluie qu’on va pouvoir alors utiliser comme collision.
- On a besoin de calculer la normale à la surface sur le parapluie au point d’impact des particules.
- Alors ce que fait cette séquence:
- Prends la collection Low Poly Umbrella
- Crée une géométrie réalisée (un vrai mesh)
- De cette géométrie, trouve d’abord l’index de la face la plus proche
- À partir de cet index, trouve la normale (Vecteur) de cette face.
- Capish?
- On va utiliser maintenant un Vector Math avec l’opération “Reflect”, qui va calculer la réflexion d’une particule qui frappe une surface en fonction de la normale à cette dernière.
- Ça tombe bien, on a gardé l’info de la position de chaque particule dans l’attribut “Vélocité, vous vous souvenez?
- On veut calculer la réflection d’une particule, basé sur sa vélocité lorsqu’elle frappe l’une des faces du parapluie.
- Avec ce calcul, la sortie du socket Reflect est un vecteur dans la direction réfléchie de la direction initiale de la particule.
- Maintenant, on doit calculer “quand”, i.e. combien proche de la surface du parapluie doit-on être pour modifier la particule et ne plus utiliser sa vélocité, mais plutôt sa valeur “Reflected”.
- Le noeud Geometry Proximity va bien nous aider pour ça!
- On veut que la proximité soit plus petite qu’une certaine valeur. Cette valeur, on va la calculer.
- On prend la position d’une particule, i.e. son vecteur, on la normalise (Noeud Named Attributed dans Normalize).
- On fait la même chose avec le vecteur à la sortie de Sample Index, qui est l’index d’une la face la plus proche d’une particule. On la normalise également.
- On utilise ensuite l’opération vectorielle Dot Product (produit scalaire), qui permet de déterminer l’angle entre deux vecteurs.
- Le produit scalaire, ça vous rappelle des mauvais souvenirs? Moi oui, quand j’étais ingénieur, quoique j’aimais les maths reliés à tout ce qui est visuel (splines, Béziers, mesh, quadriques, etc.).
Produit Scalaire, définition et exemples Le produit scalaire (également appelé produit intérieur ou dot product en anglais) de deux vecteurs est une opération mathématique qui prend deux séquences de nombres de même longueur (représentant généralement des vecteurs dans un espace euclidien) et renvoie un nombre unique (scalaire).
Définition
Pour deux vecteurs A et B dans un espace de dimension :
Le produit scalaire est défini par :
Interprétation géométrique
Le produit scalaire peut également s’exprimer en fonction des normes (magnitude) des vecteurs et du cosinus de l’angle entre eux :
Exemple de calcul:
Si
Alors
Le produit scalaire est largement utilisé en physique, en ingénierie et en informatique, notamment pour déterminer les angles entre les vecteurs, les projections et les calculs de travail en physique.
- [ ] En gros, le Dot product est utilisé pour déterminer l’orientation entre 2 vecteurs.**Interprétation d’un produit scalaire négatif **$(\mathbf{A} \cdot \mathbf{B} < 0)$** :** Comme la fonction cosinus détermine le signe du produit scalaire, un produit scalaire négatif se produit lorsque $\cos\theta < 0$ Cela arrive lorsque l’angle entre les deux vecteurs est **supérieur à 90° et inférieur à 180°** $( 90^\circ < \theta < 180^\circ )$ Cela implique que les 2 vecteurs pointent principalement dans des directions opposées. Si le produit scalaire est exactement 0, cela signifie que les vecteurs sont perpendiculaires ($\theta = 90^\circ$). - [ ] En d’autres termes: Si un vecteur est projeté sur un autre et que le produit scalaire est négatif, la projection pointe dans la **direction opposée** au vecteur de référence. - [ ] Bon ben c’est ce qu’on veut! - [ ] Donc on veut faire quelque chose si le produit scalaire est plus petit que 0. - [ ] Voici la séquence pour déterminer la direction des particules de pluie:
- [ ] En gros:
1. On va chercher la collection “Parapluie”. On “réalise les instances”, i.e. la géométrie sera un vrai mesh. Sinon, pas de collisions possibles.
2. Normal et Sample Nearest et Sample Index permettent d’aller chercher l’index de la face la plus proche d’une particule.
3. Geometry proximity va chercher la distance entre une particule de pluie et une face de la géométrie du parapluie.
4. Si la distance est “les than” un certain seuil (ici on a mis 0.2, mais on va le paramétrer avec un group input), alors le résultat est “True”, sinon le résultat est False.
5. Alimentons ce résultat dans le noeud Multiply à droite.
6. En parallèle si on veut, comparons la valeur normalisée du vecteur de la normale à la surface d’une surface donnée du parapluie (Normal + Sample Nearest + Sample Index + Normalise), et la valeur normalisée de la vélocité d’une particule de pluie (Named Attribute + Normalise).
7. Calculons le produit scalaire des deux vecteurs, donc de la vélocité de la particule et de la normale à la surface.
8. S’ils sont opposés (Less Than à droite), retourne Vrai et alimente le Multiply.
9. Si les deux valeurs à l’entrée de Multiply sont vraies, alors la sortie sera True (1), sinon la sortie sera False (0). Cette sortie alimente le Factor du Noeud Mix Vector.
10. Le Mix Vector, via son Factor qui est alimenté par le noeud Multiply, va essentiellement favoriser soit le vecteur A si Factor = False (0), ou le vecteur B si Factor = True (1).
11. L’entrée A du Mix Vector c’est la vélocité de la particule de pluie.
12. L’entrée B du Mix Vector, c’est la valeur “Reflect” par rapport à la normale à la surface du parapluie avec un Vector Math de type Scale pour contrôler le rebondissement des particules sur le parapluie.
- [ ] Puissant non?
- [ ] Maintenant, tout ça, i.e. la boîte “Direction de la pluie” va alimenter le substract avec Z = 0.01 du début.
- [ ] Si les particules de pluie ne sont pas assez proches du parapluie, c’est la vélocité dont la valeur Z est déduite de 0.01 à chaque fois.
- [ ] Si les particules sont très proches du parapluie, les particules vont aller dans la direction opposée à la normale à la surface à laquelle elles touchent, à raison de la même vélocité Z = Z = 0.01) mais cette fois-ci dans la direction de cette normale.
- [ ] Ouf, si vous êtes perdus, voici le fichier avec les noeuds à date: https://drive.google.com/file/d/1eoQBUndh8QdeNlYH0m0-lIj71TOo10Bw/view?usp=sharing
- [ ] Ok, on va brancher maintenant des noeuds du Group Input à:
- [ ] Threshold du premier Less Than (Celui après “Geometry Proximity)
- [ ] Scale du Vector Math de type Scale (après Reflect)
- [ ] Avec le noeud Group Input sélectionné, activez le N Menu (N).
- [ ] Renommez Value pour “Proximité” et Scale pour “Rebond”.
- [ ] On peut maintenant contrôler la taille de la pluie (Size X et Size Y, ainsi que la distance en deçà de laquelle les particules de pluie se mettent à rebondir ainsi que le taux de rebondissement!
- [ ] Jouez avec tout ça!
- [ ] Vous pouvez également paramétrer la valeur de l’incrément en Z (0.01) du noeud Substract, i.e. la vélocité de la pluie. Comment faire? (Hint: Combine XYZ).
- [ ] Renommez Z à Vélocité
- [ ] Et tant qu’à y être, on va paramétrer aussi la densité (noeud distribute points on faces). Il se nomme déjà Density, pas besoin de le renommer.
- [ ] Be careful with density, Size X Size Y, trop grandes valeurs = komputer kaput 🙂
- [ ] Le fichier final: https://drive.google.com/file/d/1esuuOK05OhBPpHvGxRIF3lHcEQrdvYla/view?usp=sharing
- [ ] Avec Play en action, déplacez le parapluie.
- [ ] À vous de jouer.








