Алгоритм определения координаты точки в mesh
От: DziD  
Дата: 10.10.19 19:04
Оценка:
Есть mesh Вазы (или просто набор точек/координат и индексы треугольников).
Mesh описывает как внутреннюю поверхность вазы так и внешнюю.

Нужно придумать алгоритм, который бы находил координаты центра на дне вазы (внешняя поверхность).

Может кто подскажет в какую сторону копать?
Отредактировано 10.10.2019 19:09 DziD . Предыдущая версия . Еще …
Отредактировано 10.10.2019 19:07 DziD . Предыдущая версия .
Re: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 10.10.19 19:14
Оценка:
Здравствуйте, DziD, Вы писали:

Если ваза вертикальна, то просто берешь центр масс точек с минимальным z. С большой вероятностью это будет центр дна. Если ваза повернута в любом направлении, то ищешь множество треугольников рядом, которые лежат в одной плоскости — у вазы только дно плоское, это и будет дно. Разворачиваешь чтоб это дно смотрело вниз и переходишь к первому пункту.
Re[2]: Алгоритм определения координаты точки в mesh
От: DziD  
Дата: 10.10.19 19:23
Оценка:
Здравствуйте, Homunculus, Вы писали:

H>Здравствуйте, DziD, Вы писали:


H>Если ваза вертикальна, то просто берешь центр масс точек с минимальным z. С большой вероятностью это будет центр дна. Если ваза повернута в любом направлении, то ищешь множество треугольников рядом, которые лежат в одной плоскости — у вазы только дно плоское, это и будет дно. Разворачиваешь чтоб это дно смотрело вниз и переходишь к первому пункту.


Спасибо за вариант алгоритма!
Правда в случае если точек будет больше 100к, то поиск множества треугольников, лежащих в одной плоскости, затянется.
И что если дно у вазы неровное...
Re[3]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 10.10.19 19:28
Оценка:
Здравствуйте, DziD, Вы писали:

DD>Спасибо за вариант алгоритма!

DD>Правда в случае если точек будет больше 100к, то поиск множества треугольников, лежащих в одной плоскости, затянется.

Ну у тебя ж не просто точки, а треугольники. С нормалями. Тут еще проще найти наборы треугольников у которых нормали смотрят с некоторой дельтой в одну сторону. Да и оптимизации разные придумать можно.

DD>И что если дно у вазы неровное...


С дельтами поиграйся.
Re[3]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 10.10.19 19:43
Оценка: +1
Здравствуйте, DziD, Вы писали:

Кстати, еще в голову алгоритм пришел. У любого треугольника на боковой поверхности вазы найдется зеркальный треугольник, у которого нормаль смотрит в противоположную сторону. А у дна таких симметричных треугольников не будет. Можно тут капнуть.

То есть если тупо сложить все нормали всех треугольников, то боковые компенсируют друг друга и результат суммы будет скорее всего смотреть по нормали дна.
Отредактировано 10.10.2019 19:48 Homunculus . Предыдущая версия .
Re[3]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 10.10.19 19:55
Оценка:
Здравствуйте, DziD, Вы писали:

Еще один алгоритм придумался.
Центр дна вазы — это единственная точка пересечения треугольников вазы и ост симметрии вазы. То есть ищем прямую оси вращения и протыкаем ей все треугольники. Единственная точка пересечения и будем центром дна.
Re[3]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 10.10.19 20:16
Оценка: 1 (1)
Здравствуйте, DziD, Вы писали:

Финальная версия алгоритма:
1) ищем ось вазы. То есть прямую. Для прямой в 3D надо задать точку и вектор.
Вектор оси симметрии — сумма всех нормалей всех треугольников. Найдя этот вектор, поворачиваем вазу так, чтоб этот вектор смотрел вниз (или вверх).
После этого ваза у нас стоит или на дне или дном вверх.
2) ищем габаритный бокс повернутой вазы. Центр этого габаритного бокса будет лежать на оси вращения вазы.
Нашли прямую.

Дальше этой прямой можно пересечь сам габаритный бокс. Но получим две точки, возможные центры дна. А нам нужна одна. Поэтому придется пересечь эту поямую с самими треугольниками вазы. Получим то, что ищем.
Re[4]: Алгоритм определения координаты точки в mesh
От: DziD  
Дата: 11.10.19 15:19
Оценка:
Здравствуйте, Homunculus, Вы писали:

H>Здравствуйте, DziD, Вы писали:


H>Финальная версия алгоритма:

H>1) ищем ось вазы. То есть прямую. Для прямой в 3D надо задать точку и вектор.
H>Вектор оси симметрии — сумма всех нормалей всех треугольников. Найдя этот вектор, поворачиваем вазу так, чтоб этот вектор смотрел вниз (или вверх).
H>После этого ваза у нас стоит или на дне или дном вверх.
H>2) ищем габаритный бокс повернутой вазы. Центр этого габаритного бокса будет лежать на оси вращения вазы.
H> Нашли прямую.

H>Дальше этой прямой можно пересечь сам габаритный бокс. Но получим две точки, возможные центры дна. А нам нужна одна. Поэтому придется пересечь эту поямую с самими треугольниками вазы. Получим то, что ищем.


Не совсем понимаю, как вектор оси симметрии может быть равен вектору сумме всех нормалей. Я попробовал его посчитать, и пустить из центра, он улетел далеко и не по направлению оси

А в целом большое спасибо, направление куда ковырять понял.
Сейчас я могу определить вершины на выгнутом дне вазы (правда, пока она "правильно" ориентирована). Для этого я считаю нормали треугольников, и просто отсекаю все треугольники, которые не смотрят вниз. Далее выбираю (делю по подгруппам) все треугольники которые находятся рядом друг с другом, если получилась одна подгруппа, то значит мы попали в "дно", если несколько, то выбираю ту, у которых средняя координата высоты меньше...

Осталась проблема с ориентацией.
Re: Алгоритм определения координаты точки в mesh
От: ylem  
Дата: 12.10.19 20:41
Оценка:
DD>Может кто подскажет в какую сторону копать?

Попереворачивать ваше облако точек. Минимум 6 вариантов.
Для каждого из вариантов как-то "сымулировать заполнение жидкостью". Не частицами. Что-нибудь типа поднятых вверх до предположительной плоскости горлышка (или до пересечения) "призм" должно помочь.

Так вы найдете, в какую сторону примерно верх. Использовать эту ось как начальное решение для итерационного алгоритма: понаклонять ось во все стороны, пока конструкция не встанет на три точки.
Решить, что внутри этих трех точек считать центром.
Еще придется решить, что считать плоскостью горлышка (у декоративных ваз он может быть очень неровный).

Не уверен, что это работает но меня обычно выручают алгоритмы не читерские (вроде суммы нормалей), а те которые моделируют "суть" явления/объекта: в данном случае содержать жидкость + не падать на ровной поверхности.

В предельном случае ваза может быть очень сложной. Представьте себе корявую "картошку" у которой сделали два параллельных среза с разных сторон (верх и дно) и с одной из сторон сделали углубление.
Даже в этом случае нет гарантии, что где-то не найдется более вместительно естественного углубления, такого, что на противоположной стороне будут три точки, на которые ваза обопрется.
Отредактировано 12.10.2019 20:43 ylem . Предыдущая версия .
Re[2]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 12.10.19 20:46
Оценка:
Здравствуйте, ylem, Вы писали:

Потому что «читерские» как ты выразился, для более-менее реальных задач, решаемых в реал-тайме. А не фантазий с «заполнениями» жидкостями, которые самый продвинутый физический движок будет считать и считать.
Re[5]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 12.10.19 20:48
Оценка:
Здравствуйте, DziD, Вы писали:

ну складывать-то надо с умом. Во-первых отсечь треугольники внутренней грани, они не нужны в расчете и не помогут найти точку центра дна. Ты отсек?
Re[3]: Алгоритм определения координаты точки в mesh
От: ylem  
Дата: 12.10.19 20:52
Оценка:
H>Потому что «читерские» как ты выразился, для более-менее реальных задач, решаемых в реал-тайме. А не фантазий с «заполнениями» жидкостями, которые самый продвинутый физический движок будет считать и считать.

Их правда нельзя складывать. Они безразмерные. Достаточно перекоса в регулярности меша, и все испортится.

Физический движок не нужен. Поднимает плоскость от нижней точки внутреннего дна, пока вода не начнет выливаться. Потом считаем объем.

Читерский вариант для простых круглых ваз.
Построить convex hull (взять готовую реализацию, в 3D это не просто).
Начать генерализовывать. Как только выделится две плоскости, как-то определить, в какую плоскость смотрит горлышко. Для общего случая все равно придется пускать лучи и оценивать объем.
Это все не сработает, если ваза имеет плоские элементы кроме дна.

Очень быстрое решение тут вряд ли нужно, потому что новые вазы с частотой 100pfs не появляются.

Ну и прошу прощения за "читерские". Я понимаю, что в ентертейнменте нужна производительность и эффектность. Мой опыт про инженерный софт.
Отредактировано 13.10.2019 0:09 ylem . Предыдущая версия . Еще …
Отредактировано 12.10.2019 23:10 ylem . Предыдущая версия .
Отредактировано 12.10.2019 21:02 ylem . Предыдущая версия .
Отредактировано 12.10.2019 21:00 ylem . Предыдущая версия .
Отредактировано 12.10.2019 20:58 ylem . Предыдущая версия .
Отредактировано 12.10.2019 20:55 ylem . Предыдущая версия .
Re[6]: Алгоритм определения координаты точки в mesh
От: DziD  
Дата: 13.10.19 04:51
Оценка:
Здравствуйте, Homunculus, Вы писали:

H>Здравствуйте, DziD, Вы писали:


H>ну складывать-то надо с умом. Во-первых отсечь треугольники внутренней грани, они не нужны в расчете и не помогут найти точку центра дна. Ты отсек?


Да, все внутренние грани я отсек. Я "выравнивание" сделал с помощью OBB.
Re[2]: Алгоритм определения координаты точки в mesh
От: DziD  
Дата: 13.10.19 04:56
Оценка:
Здравствуйте, ylem, Вы писали:

DD>>Может кто подскажет в какую сторону копать?


Y>Попереворачивать ваше облако точек. Минимум 6 вариантов.

Y>Для каждого из вариантов как-то "сымулировать заполнение жидкостью". Не частицами. Что-нибудь типа поднятых вверх до предположительной плоскости горлышка (или до пересечения) "призм" должно помочь.

Y>Так вы найдете, в какую сторону примерно верх. Использовать эту ось как начальное решение для итерационного алгоритма: понаклонять ось во все стороны, пока конструкция не встанет на три точки.

Y>Решить, что внутри этих трех точек считать центром.
Y>Еще придется решить, что считать плоскостью горлышка (у декоративных ваз он может быть очень неровный).

Y>Не уверен, что это работает но меня обычно выручают алгоритмы не читерские (вроде суммы нормалей), а те которые моделируют "суть" явления/объекта: в данном случае содержать жидкость + не падать на ровной поверхности.


Y>В предельном случае ваза может быть очень сложной. Представьте себе корявую "картошку" у которой сделали два параллельных среза с разных сторон (верх и дно) и с одной из сторон сделали углубление.

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


Да, вазы разные бывают, и даже в виде пивного бокала. Вариант с наливанием жидкости сложен, во первых для него времени нужно много, да и нужно будет проводить предварительную обработку точек для физического движка.
Re[7]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 13.10.19 05:43
Оценка: 1 (1)
Здравствуйте, DziD, Вы писали:

DD>Да, все внутренние грани я отсек. Я "выравнивание" сделал с помощью OBB.


Странная «ваза» тогда. С ручкой что ли? У тела вращения должно получиться как я описал.
Re[8]: Алгоритм определения координаты точки в mesh
От: DziD  
Дата: 13.10.19 08:09
Оценка:
Здравствуйте, Homunculus, Вы писали:

H>Здравствуйте, DziD, Вы писали:


DD>>Да, все внутренние грани я отсек. Я "выравнивание" сделал с помощью OBB.


H>Странная «ваза» тогда. С ручкой что ли? У тела вращения должно получиться как я описал.


С телом вращения работает
Re[9]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 13.10.19 08:15
Оценка:
Здравствуйте, DziD, Вы писали:


DD>С телом вращения работает


Так ты в начальном вопросе написал «ваза». Под этим обычно тела воащения подразумеваются. Я для них и писал алгоритм.
Re[3]: Алгоритм определения координаты точки в mesh
От: ylem  
Дата: 13.10.19 09:07
Оценка:
DD>Да, вазы разные бывают, и даже в виде пивного бокала. Вариант с наливанием жидкости сложен, во первых для него времени нужно много, да и нужно будет проводить предварительную обработку точек для физического движка.

Движек и имулирование настоящего наливание не нужены. Нужно просто оценить объем. Для этого хватит построить "призмы" из фейсов вдоль предполагаемой оси. Строить до плоскости горлышка или до пересечения с плоскотью вазы.
Если у ваших ваз нет дырок в боку, то горлышко можно искать сверху. Если есть -- снизу.

UPD: походу, строить призмы и пускать лучи не нужно. Должно сработать опускать/поднимать горизонтальную (для текущего проверямого направления оси) плоскость, пока на ней есть замкнутая линия (внутренняя поверхность, в моем детстве была "ваза", где их будет несколько) внутри другой замкнутой линии (внешняя поверхность). Пупутно по этим срезам посчитать объем.
Если нормали гарантированно направлены наружу (не в материал вазы), можно обойтись и без двух линий.

https://i0.wp.com/meowlogy.com/wp-content/uploads/2017/04/Terrarium-Decoration-Ideas-17.jpg?w=570&ssl=1
Если бывают и такие "вазы", то для них, видимо, придется усложнять перебор направлений. Типа, учитывать устойчивое и неутойчивое равновесие.

Если у вас есть библиотека (надеюсь, что есть) которая умеет 1. построить выпуклую оболочку и 2. генерализовать поверхность (лучше пошагово), можно попробовать найти плоскости верха и низа. Но даже в этом случае придется научиться оценивать, где низ, а где верх: представье неглубокую пиалу с очень впуклым внурь дном.
И это, очевидно, не сработает с вазой, к которой есть плоские грани.


А еще, на всякий, стоит выяснить, точно ли ваши вазы -- сосуды. Если нет то все надо делать как-то совсем подругому, и тут идея с "самокомпенсирующимися" нормалями уже не кажется тупиком
http://ideas.vdolevke.ru/i/photos/full/jn755zU83XP3Z6j0T4OH.jpg
Отредактировано 13.10.2019 11:41 ylem . Предыдущая версия . Еще …
Отредактировано 13.10.2019 10:06 ylem . Предыдущая версия .
Отредактировано 13.10.2019 10:03 ylem . Предыдущая версия .
Отредактировано 13.10.2019 9:37 ylem . Предыдущая версия .
Re[4]: Алгоритм определения координаты точки в mesh
От: Homunculus Россия  
Дата: 13.10.19 09:26
Оценка: +1
Здравствуйте, ylem, Вы писали:

Ну вот. Сначала ни за что ни про что читером обозвал. Потом пренебрежительно в энтертеймент записал. За что?
Я к твому сведению пишу софт по расчетам прочностей и взрывов, а не игрушки. Это не значит что надо отказываться от простой и быстрой геометрии и сразу стрелять из пушки по воробьям
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.