Хай народ!
Ломаю голову, как можно было относительно просто определить факт пересечения тора и луча.
Если есть методики, буду очень благодарен за наводку.
А пока держите просто скриншот, не имеющий информационной нагрузки =)

Относительно просто — это аппроксимировать тор сферами вдоль образующего круга, и провести последовательно пересечение с каждой. Оптимизировать одной большой проверкой — сферой, описанной вокруг тора.
jaguard
Спасибо!
Тоже думал про сферы, но про оптимизацию не задумывался.
Собсно задача - определить нажатие на окружность, показанную на скриншоте.
Оптимизация конкретно здесь в данный момент мне не важна.
Так и сделал, производительность устраивает.
Сенкс, вопрос закрыт.
barbanel
> Ломаю голову, как можно было относительно просто определить факт пересечения тора и луча
Судя по картинке, тор у тебя довольно таки тонкий, более того, очевидно, что он лежит на плоскости, поэтому можно сделать ещё проще - вычисляешь точку пересечения луча с плоскостью тора и решаешь задачу в 2д в плане нахождения точки пересечения точки и окружности с толщиной. По сути, тебе нужно из точки вычесть центр окружности, затем построить вектор из нуля в эту точку и сравнить длину вектора с радиусом окружности тора +- его толщину.
dominator
Прикольно. Спасибо!
Попробую на досуге.
ncuxonaT
Мощно, утащил в закладки!
Гранд мерси!
barbanel
> Тоже думал про сферы, но про оптимизацию не задумывался.
> Собсно задача - определить нажатие на окружность, показанную на скриншоте.
> Оптимизация конкретно здесь в данный момент мне не важна.
Мне кажется, в этом случае проще сделать эту область не тором, а цилиндром с дыркой. И считать 4 более простых пересечения — 2 с боковой поверхностью цилиндра, и 2 тупо на плоскость, и с проверкой точки на принадлежность кольцу уже внутри этой плоскости.
А у тебя тор процедурный что ли? Тогда странно что ты про формулы SDF не знал. А если он не процедурный и рисуешь ты его обычным триангулированным меш-ом, тогда почему бы не проверять пересечения классическим способом - проверкой ID-шника закрашиваемого меш-а в пикселе под мышкой во фрагментном шейдере?
Хы, стало интересно насчет общей задачи пересечения луча и тора.
Для тора с радиусами 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 или какие-нибудь другие системы символьной алгебры тоже обломаются? У кого есть?
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 вообще нету )
barbanel
> Ломаю голову, как можно было относительно просто определить факт пересечения тора и луча.
> Если есть методики, буду очень благодарен за наводку.
Короче вот прикольный сайт. О нём мало кто знает.
Там печатаешь текст того что хочешь найти и он тебе выдаёт ссылки по которым курсором мышки щелкать надо.

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
чето тут движ.
Я вот чо думаю.
Тема в архиве.