Ferlan
> тут тоже должен быть минус перед аргументом.
спасибо, не заметил
Ferlan
> Из этого получается, что угол между pdi и vi стремится к нулю, причем pd
> откладывается от O. Верно ли я понимаю, что из этого напрямую следует, что мы
> ищем такой v который проходит через центр координат O. Т.е. задача сводится к
> тому чтобы найти v проходящий через О, он и будет PD.
> Т.е, если r = CSO(v), то необходимо найти такой v, что r = kv, где k некоторое
> число.
> Можно просто решать задачу многомерной оптимизации (в случае 2D - одномерной,
> по углу) (v,cso(v)) / |cso(v)| -> max
да, именно так. вообще говоря, задача многомерной оптимизации формулируется даже проще |cso(v)| -> min, нужно найти самую близкую точку на cso к началу координат, соответствующий ей вектор v и будет DPD. просто специфика задачи в том, что локальный минимум обычно совпадает с глобальным + нужно по максимуму использовать временную когерентность, так как от шага к шагу по времени ситуация меняется несильно. предложенная мной схема именно этим и занимается, обычно PD находится за 1-2 итерации.
Ferlan
> Верно ли утверждение, что если произвольные три отбалды взятые v1, v2, v3 пересекаются в одной точке C, то в качестве PD достаточно взять вектор в направлении CO? Вроде нехилая оптимизация.
не совсем понял, что ты имеешь в виду. три прямые в трёхмерном случае вовсе не обязаны пересекаться в принципе. но ты, кажется, идёшь в направлении идеи portal refinement'а, когда в качестве PD берётся следующее значние: (cso(v1) + cso(v2) + cso(v3)) / 3 и при надобности уточняется, выкидыванием одной из начальных точек(v1, v2 или v3) повторением итерации до тех пор, пока три точки не стянутся достаточно близко друг к другу.
Здравствуйте. по мере разбираний с алгоритмом появился вопрос. Как быть, если контакт фактический одной вершиной?(на рисунке будет понятнее). к какой именно точке прикладывать импульс?
fysx
> Здравствуйте. по мере разбираний с алгоритмом появился вопрос. Как быть, если
> контакт фактический одной вершиной?(на рисунке будет понятнее). к какой именно
> точке прикладывать импульс?
из статьи:
2) Наклоним вектор axis на delta градусов против часовой стрелки, и возьмём в этом направлении саппорт пойнт нижнего бокса, обозначим её a1. Далее повернём тот же axis на ту же delta по часовой стрелке, вновь возьмём саппорт пойнт того же бокса и обозначим получившуюся точку b1. Далее инвертируем вектор axis, и, вновь поворачивая его ан угол delta, берём два саппорт пойнта верхнего бокса - a2 и b2. Может получиться так, что какие-то из этих точек совпадут - ничего страшного, это совершенно нормально.
для твоего случая, когда ты наклоняешь axis на delta вправо и влево, саппорт пойнты нижнего бокса совпадут, и вместо точек a1 и b1 ты получишь одну - a1. далее просто проецируешь эту точку на отрезок a2 b2(у тебя проекция обозначена как a1'), в качестве точки контакта выбираешь среднюю между a1 и a1', в качестве нормали - нормаль отрезка a2 b2.
Suslik
Благодарю за разъяснение. Плюс я видимо неверно угол выбира, т.к. выбираются две точки. немного недопонял этот вопрос - он у меня генерится динамически. (в зависимости от ориентации объектов - это я ступил) правильно ли будет выбирать delta в зависимости от количества граней?
fysx
> правильно ли будет выбирать delta в зависимости от количества граней?
нет. я выбираю всегда константным - таким образом, чтобы две точки, получающиеся на окружности, например, считались одной. то есть это угол около 10 градусов. этот угол соответствует углу, когда две грани можно считать параллельными, то есть если угол между столкнувшимися гранями меньше этого delta, то это столкнулись грани, если больше - столкнулась грань с вершиной.
ok, спасибо за статью и разъяснения, буду пробовать.
Извиняюсь за надоедливость, появился очередной вопрос - у меня получается в обеих геометриях по одной точке - как раз случай тот что на рисунке. точка а2 содержит в себе и b2, и a1 содержит b1. как в этом случае строить проекцию?
fysx
> Извиняюсь за надоедливость, появился очередной вопрос - у меня получается в обеих геометриях по одной точке - как раз случай тот что на рисунке. точка а2 содержит в себе и b2, и a1 содержит b1. как в этом случае строить проекцию?
я проецирую обе получившиеся точки (a1 и a2) на плоскость, перпендикулярную направлению axis. если расстояние между проекциями меньше некоторого эпсилон, но считаем, что это - контакт типа точка-точка, берём точку контакта как среднее и axis как нормаль контакта. иначе контакт не добавляем.
кстати, на рисунке у тебя penetration vector(он же axis) - вертикальная прямая. то есть контакт типа вершина-ребро, а не вершина-вершина.
про контакт точка-точчка я понимаю, у меня немного другая проблема - не получается контакта ребро - вершина. т.е. и у нижней, и у верхней геометрий оба саппорт-вектора сходятся к одной точке. но судя по рисунку, это косяк в нахождении самого вектора. хотя там вроде не должно быть проблем - все просто. завтра буду перепроверять все
fysx
> про контакт точка-точчка я понимаю, у меня немного другая проблема - не
> получается контакта ребро - вершина. т.е. и у нижней, и у верхней геометрий оба
> саппорт-вектора сходятся к одной точке. но судя по рисунку, это косяк в
> нахождении самого вектора. хотя там вроде не должно быть проблем - все просто.
> завтра буду перепроверять все
да, если на рисунке вектор направлен не вертикально, это баг. ищи ошибку в его нахождении.
Добрый день.
Дошли руки, предыдущие проблемы с Вашей помощью я решил, точки находятся нормально. Но вот в таком случае они не находятся(что в приницпе понятно)
как быть в этом случае?
fysx
не понял. в чём проблема? PD-вектор в данном случае также должен быть вертикальным. проецируем точки одного отрезка на другой, получаем две точки контакта, что не так?
ну так в статье написано
либо ни одной, либо, как в нашем случае две точки при проекции попадают на противоположенный отрезок
в данном случае на противоположные отрезки попадает по одной точке.
но видимо это я не правильно понял, и контакт считается совершенным если есть любые две точки. буду править код
fysx
> либо ни одной, либо, как в нашем случае две точки при проекции попадают на противоположенный отрезок
> в данном случае на противоположные отрезки попадает по одной точке.
у двух отрезков по одной точке проецируются, итого в сумме две точки. стоит как-то переформулировать этот момент в тексте статьи?
радует, что ещё кто-то по статье разобрался с алгоритмом, практически от и до
Suslik
> у двух отрезков по одной точке проецируются, итого в сумме две точки. стоит
> как-то переформулировать этот момент в тексте статьи?
думаю, что стоит, по крайней меря е до этого допер только после того как задал вопрос)
Тема в архиве.
Регистрация на Слотокинг с бонусом Регистрация на Слотокинг с бонусом obzor365.com |