примерчиков нет...
но, ежели никто больше не отзовётся, можно попытаться :
:arrow: нахождение геометрического центра(ГЦ) - если объект (ОБ) не неняется, то ГЦ(Cx,Cy,Cz) находим один раз при инициализации
CОБx=S(ОБvxi)/n
CОБy=S(ОБvyi)/n
CОБz=S(ОБvzi)/n
Vi - i-я вершина ОБ, n - количество вершин
CAx=S(CAvxi)/n
CAy=S(CAvyi)/n
CAz=S(CAvzi)/n
CBx=S(CBvxi)/n
CBy=S(CBvyi)/n
CBz=S(CBvzi)/n
*** CA, CB - нашли ***
:arrow:
проводим линию Lcb через точки CA и CB.
Уравнение прямой:
Lcb = (x-CAx)/Lvx = (y-CAy)/Lvy = (z-CAz)/Lvz ;
Lv(Lvx,Lvy,Lvz)=(CBx-CAx, CBy-CAy, CBz-CAz) (направляющий вектор прямой)
(причём здесь направление вектора - от CA к CB)
:arrow: составляем уравнение плоскости Tb:
Lvx*(x-CBx)+Lvy*(y-CBy)+Lvz*(z-CBz)=0
:arrow:
теперь находим расстояния от вершин ОБ A до плоскости Tb до .
расстояние D от вершины Av(Avx, Avy, Avz) до плоскости
D = (Lvx*CAx + Lvy*CAy + Lvz*CAz)/ |Lv|
где |Lv| - модуль вектора Lv
:arrow:
Теперь:
1) Если расстояние D положительное, то эта вершина ОБ A находится "на расстоянии" от ОБ B
2) Если расстояние D равно нулю (+- точность=0,0...01), то эта вершина ОБ A находится "коснулась" ОБ B
3) Если расстояние D отрицательное, то эта вершина ОБ A "пересекла" ОБ B
в кавычках - потому, что это можно использовать только для упрощённой модели столкновений.
Если же надо точно, то:
:arrow:
находим вершину ОБ A, у которой "наименьшее" расстояние от плоскости Tb. Снова в кавычках, потому что снова условности: расстояние берём не по модулю, а со знаком, как есть.
Пусть вершина Av1 - искомая вершина.
Теперь самое сложное.
проводим через Av1 плоскость Ta1, параллельную Tb:
Lvx*(x-Avx)+Lvy*(y-Avy)+Lvz*(z-Avz)=0
теперь представь, что происходит: плоскость, проходящая через вершину ОБ A, пересекает ОБ B. В результате на этой плоскости образуется замкнутая кривая и точка. Кривая состоит из линий, образованных пересечением полигонов ОБ B с плоскостью Ta1. Это отдельная задача - с ходу я так не придумаю...
А дальше нужно просто определить, попала ли точка внутрь кривой. Но кривая может выродится и в точку (плоскость коснулсь ОБ B) или вообще отсутствовать (точка "перемахнула" за ОБ B). В обоих этих случаях объект А пересёк ОБ B.
Если кривая существует, то есть опять два способа определить, внутри ли точка , или нет : упрощенный и очень точный
:arrow: упрощенный
здесь просто очерчиваем кривую прямоугольником и определяем, находится ли точка внутри него
:arrow: точный - всеми правдами и неправдами определяем, находится ли точка внутри...
Вот и остались две задачи, которые я с ходу не решу
1) Кривая состоит из линий, образованных пересечением полигонов ОБ B с плоскостью Ta1.
2) здесь просто очерчиваем кривую прямоугольником и определяем, находится ли точка внутри него
на это времени у меня сейчас не хватит