Получить вектор направления потока воды из нормального вектора воды

8

Я застрял, развивая важную деталь моей игровой воды: заставляя ее течь вниз!

Учитывая типичный трехмерный мир, в котором вода стремится к гравитации g=(0,-1,0), и имея нормаль водной поверхности n=(x,y,z), как я могу рассчитать, основываясь на этом, вектор направления потока воды?

В качестве примера рассмотрим этот плохо сделанный граф (хотя в 2D)

График потока воды

Обновление: я рассматриваю очень упрощенную поверхность воды (просто плоскость: без ряби, без волн, без давления и т. Д.). Если какой-либо из них необходимо применить, ответ будет зависеть от большего числа факторов, чем просто нормальный.

Ivelate
источник

Ответы:

13

Один из способов сделать это, учитывая, что вам нужен угол 90 °, - найти перекрестное произведение нормали и силы тяжести, нормализовать его, а затем снова скрестить с нормалью.

На вашей диаграмме первый крестик создаст вектор, указывающий на экран, а второй крестик создаст вектор потока.

Интересным побочным эффектом использования перекрестных продуктов является то, что вектор потока будет тем длиннее, чем дальше вектор нормали от вертикали, что можно использовать для скорости потока?

Это предполагает, что вы используете правую систему координат, если ваша система - левая рука, промежуточный вектор вместо этого будет указывать за пределы экрана, но все равно будет давать тот же результат.

Вор в законе
источник
Да, это выглядит великолепно. Даже когда это выглядит так просто, когда я объяснил, я потратил около получаса, думая о разных (неправильных) способах сделать это, и я полностью упустил этот. Спасибо!
Ivelate
Это не произведет ничего, что отдаленно напоминает то, что вы обычно думаете как направление потока. Чтобы понять, почему стоит подумать о том, какими будут нормальные поверхности реки, протекающей через вашу карту, и как они будут различаться в реке, протекающей с востока на запад и с запада на восток (т.е. это не так).
Джек Эйдли
1
Что если нормаль и гравитация (анти) параллельны? Я не могу не найти смысла в этом ответе. Как сказал @JackAidley, существует бесконечно много возможных направлений потока при заданной нормали.
Маргарет Блум
1
Учитывая упрощенную модель, представленную в вопросе, я считаю, что этот ответ даст вектор, который они искали. @Margaret Если векторы (анти) параллельны, то вектор потока будет (0,0,0), который будет ожидаемым потоком в плоском водоеме, то есть в пруду / озере
KingPin
@KingPin: река - это также плоское водное пространство, и большинство озер вытекает в реки.
Джек Эйдли
1

Вы не можете определить направление потока воды от ее поверхности нормали, вам нужно будет хранить дополнительные данные.

Простое путешествие, чтобы посмотреть на реку должно быть достаточно, чтобы убедить вас в этом. Любая разница в поверхностных нормалях просто отражает волнистость на поверхности, масса воды продолжает течь в том же направлении. Но основная причина в том, что нормаль определяет плоскость, и вам нужен вектор потока. Ваши векторы - это форма поверхности, а не движение воды.

Джек Эйдли
источник
1
Правда, ты прав. Я рассматривал просто очень упрощенный водоем (без ряби, без волн, без давления и т. Д.), Но, конечно, в реальной жизни этот расчет не был бы таким простым. Я собираюсь обновить вопрос, чтобы прояснить эти детали. Спасибо за ваш вклад!
Ivelate