Obtenir le vecteur de direction du débit d'eau à partir du vecteur normal de l'eau

8

Je suis coincé à développer un détail important de mon eau de jeu: le faire couler vers le bas!

Considérant un monde 3D typique dans lequel l'eau a tendance à aller vers la gravité g=(0,-1,0)et ayant la normale à la surface de l'eau n=(x,y,z), comment puis-je calculer, sur cette base, le vecteur de direction du flux d'eau?

À titre d'exemple, considérons ce graphique mal fait (en 2D, cependant)

Graphique de débit d'eau

Mise à jour: j'envisage une surface d'eau très simplifiée (juste un avion: pas d'ondulations, pas de vagues, pas de pression, etc.). Si l'un de ces éléments devait être appliqué, la réponse dépendrait de plus de facteurs que la normale.

Ivelate
la source

Réponses:

13

Une façon de le faire, étant donné que vous voulez un angle de 90 °, est de trouver le produit croisé de la normale et de la gravité, de le normaliser, puis de le recouper avec la normale.

Dans votre diagramme, la première croix produira un vecteur pointant vers l'écran et la deuxième croix produira le vecteur de flux.

Un effet secondaire intéressant de l'utilisation de produits croisés est que le vecteur d'écoulement sera d'autant plus long que le vecteur normal est éloigné de la verticale, ce qui pourrait être utilisé pour la vitesse d'écoulement?

Cela suppose que vous utilisez un système de coordonnées droitier, si votre système est à gauche, le vecteur intermédiaire pointera à la place sur l'écran, mais produira toujours le même résultat.

Pivot central
la source
Ouais, ça a l'air super. Même si cela semble si simple une fois expliqué, j'ai passé une demi-heure à réfléchir à différentes (mauvaises) façons de le faire, et j'ai complètement raté celle-ci. Merci!
Ivelate
Cela ne produira rien qui ressemble à distance à ce que vous penseriez normalement comme une direction d'écoulement. Pour voir pourquoi considérer les normales de surface d'une rivière qui coule sur votre carte et comment elles vont différer dans une rivière qui coule d'est en ouest et d'ouest en est (c'est-à-dire qu'elles ne le sont pas).
Jack Aidley
1
Et si la normale et la gravité sont (anti) parallèles? Je ne peux pas m'empêcher de trouver aucun sens dans cette réponse. Comme l'a dit @JackAidley, il existe une infinité de directions d'écoulement possibles étant donné une normale.
Margaret Bloom
1
Étant donné le modèle simplifié présenté dans la question, je pense que cette réponse produira le vecteur qu'ils recherchaient. @Margaret Si les vecteurs sont (anti) parallèles, alors le vecteur de débit sera (0,0,0) qui serait le débit attendu dans un plan d'eau plat, c'est-à-dire un étang / lac
KingPin
@KingPin: Une rivière est également un plan d'eau plat et la plupart des lacs se jettent dans les rivières.
Jack Aidley
1

Vous ne pouvez pas déterminer la direction de l'écoulement de l'eau à partir de ses normales de surface, vous devrez stocker des données supplémentaires.

Un simple voyage pour regarder une rivière devrait suffire à vous en convaincre. Toute différence dans les normales de surface reflète simplement l'ondulation de la surface, la masse d'eau continue de couler dans la même direction. Mais la raison sous-jacente est que la normale définit un plan et que vous avez besoin d'un vecteur de flux. Vos vecteurs concernent la forme de la surface et non le mouvement de l'eau.

Jack Aidley
la source
1
C'est vrai, vous avez raison. Je considérais juste un plan d'eau très simplifié (pas d'ondulations, pas de vagues, pas de pression, etc.), mais certainement dans la vraie vie, ce calcul ne serait pas si simple. Je vais mettre à jour la question pour clarifier ces détails. Merci pour votre contribution!
Ivelate