ПрограммированиеФорумГрафика

Определение пересечения тора и луча

Страницы: 1 2 3 Следующая »
#0
20:06, 20 мая 2024

Хай народ!

Ломаю голову, как можно было относительно просто определить факт пересечения тора и луча.
Если есть методики, буду очень благодарен за наводку.

А пока держите просто скриншот, не имеющий информационной нагрузки =)
скриншот 8 | Определение пересечения тора и луча

#1
20:21, 20 мая 2024

Относительно просто — это аппроксимировать тор сферами вдоль образующего круга, и провести последовательно пересечение с каждой. Оптимизировать одной большой проверкой — сферой, описанной вокруг тора.

#2
20:33, 20 мая 2024

jaguard
Спасибо!
Тоже думал про сферы, но про оптимизацию не задумывался.
Собсно задача - определить нажатие на окружность, показанную на скриншоте.
Оптимизация конкретно здесь в данный момент мне не важна.

#3
20:57, 20 мая 2024

Так и сделал, производительность устраивает.
Сенкс, вопрос закрыт.

#4
21:02, 20 мая 2024

barbanel
> Ломаю голову, как можно было относительно просто определить факт пересечения тора и луча
Судя по картинке, тор у тебя довольно таки тонкий, более того, очевидно, что он лежит на плоскости, поэтому можно сделать ещё проще - вычисляешь точку пересечения луча с плоскостью тора и решаешь задачу в 2д в плане нахождения точки пересечения точки и окружности с толщиной. По сути, тебе нужно из точки вычесть центр окружности, затем построить вектор из нуля в эту точку и сравнить длину вектора с радиусом окружности тора +- его толщину.

#5
22:35, 20 мая 2024

https://iquilezles.org/articles/intersectors/
https://www.shadertoy.com/view/4sBGDy

#6
23:14, 20 мая 2024

dominator
Прикольно. Спасибо!
Попробую на досуге.

#7
23:19, 20 мая 2024

ncuxonaT
Мощно, утащил в закладки!
Гранд мерси!

#8
7:10, 21 мая 2024

barbanel
> Тоже думал про сферы, но про оптимизацию не задумывался.
> Собсно задача - определить нажатие на окружность, показанную на скриншоте.
> Оптимизация конкретно здесь в данный момент мне не важна.
Мне кажется, в этом случае проще сделать эту область не тором, а цилиндром с дыркой. И считать 4 более простых пересечения — 2 с боковой поверхностью цилиндра, и 2 тупо на плоскость, и с проверкой точки на принадлежность кольцу уже внутри этой плоскости.

#9
7:44, 21 мая 2024

А у тебя тор процедурный что ли? Тогда странно что ты про формулы SDF не знал. А если он не процедурный и рисуешь ты его обычным триангулированным меш-ом, тогда почему бы не проверять пересечения классическим способом - проверкой ID-шника закрашиваемого меш-а в пикселе под мышкой во фрагментном шейдере?

#10
11:01, 21 мая 2024

Хы, стало интересно насчет общей задачи пересечения луча и тора.

Для тора с радиусами R и r, лежащего в плоскости z=0, и прямой, заданной параметрически для точки (x0, y0, z0) и направляющей (px, py, pz), надо решить относительно переменной t уравнение

R**4 - 2*R**2*r**2 - 2*R**2*x0**2 - 2*R**2*y0**2 + 2*R**2*z0**2 + r**4 - 2*r**2*x0**2 - 2*r**2*y0**2 - 2*r**2*z0**2 + x0**4 + 2*x0**2*y0**2 + 2*x0**2*z0**2 + y0**4 + 2*y0**2*z0**2 + z0**4 = 0

Вроде бы это (если все развернуть и собрать коэффициенты при степенях t)

+ Показать


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

Интересно, всякие там mathcad или какие-нибудь другие системы символьной алгебры тоже обломаются? У кого есть?

#11
11:29, 21 мая 2024

Dmitry_Milk
> У кого есть?
Есть онлайн: https://www.wolframalpha.com/
На это:

R**4 - 2*R**2*r**2 - 2*R**2*x0**2 - 2*R**2*y0**2 + 2*R**2*z0**2 + r**4 - 2*r**2*x0**2 - 2*r**2*y0**2 - 2*r**2*z0**2 + x0**4 + 2*x0**2*y0**2 + 2*x0**2*z0**2 + y0**4 + 2*y0**2*z0**2 + z0**4 = 0

Выдаёт это:

+ Показать

Dmitry_Milk
Развёрнутый вариант не проглатывает, говорит что слишком много букв.
В правильность исходной формулы, в корректность её интерпретации WolframAlpha, а так же в правильность ответа - не вникал )
> решить относительно переменной t
в твоей формуле t вообще нету )

#12
12:44, 21 мая 2024

barbanel
> Ломаю голову, как можно было относительно просто определить факт пересечения тора и луча.
> Если есть методики, буду очень благодарен за наводку.
Короче вот прикольный сайт. О нём мало кто знает.
Там печатаешь текст того что хочешь найти и он тебе выдаёт ссылки по которым курсором мышки щелкать надо.

+ Показать
Изображение
#13
14:58, 21 мая 2024

dominator
> в твоей формуле t вообще нету )

Хы, да, не ту формулу из терминала скопировал :)

Вот эту надо

(R**2 - r**2 + (px*t + x0)**2 + (py*t + y0)**2 + (pz*t + z0)**2)**2 - 4*R**2*((px*t + x0)**2 + (py*t + y0)**2) = 0
#14
15:08, 21 мая 2024

чето тут движ.

Я вот чо думаю.

+ Костыльное кунг-фу
Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.