Войти
ПрограммированиеФорумОбщее

Ручная проверка нахождения точки внутри объекта

#0
3:31, 1 мар. 2018

У меня такой вопрос: есть различные зоны (постэффекты, звуковые, триггеры и прочие), хранить их я планирую в виде несложных статичных моделей.
В начале вывода 3D-сцены хочу сделать проверку на вхождение Eye камеры в эти зоны. Как мне проверить нахождение vec3 внутри VBO?
Желательно без использования библиотек физики.


#1
4:26, 1 мар. 2018

предлагаю сделать упрощенную проверку на вхождение точки в объем (сферу, параллелепипед) (т.е аппроксимация вашей модели чем-то, вхождение куда легко проверить), а далее (если потребуется) придумывать что-то посложнее, ну там вхождение в вытянутый полигон скажем, если параллельно оси взгляда то экструзия вдоль этой оси полигон проверяется сначала по 2м осям x-y а потом если входит в 2d полигон - проверяется еще и z координата

#2
7:37, 1 мар. 2018

Daniil Petrov
>У меня такой вопрос: есть различные зоны (постэффекты, звуковые, триггеры и прочие), хранить их я планирую в виде несложных статичных моделей.
зачем? почему сразу не расставлять боксами всё это?

#3
10:32, 1 мар. 2018

Daniil Petrov
> Как мне проверить нахождение vec3 внутри VBO?
если это convex фигура, то элементарно. Если concave, то дели на несколько convex'ов и храни их в таком уже виде.

#4
13:53, 1 мар. 2018

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

#5
14:05, 1 мар. 2018

Daniil Petrov
Точка внутри невыпуклого меша?
Проводишь от нее луч, скажем вертикально вниз и считаешь число пересечений с гранями
Если нечетно - точка внутри, четно - снаружи
Для вертикального луча пересечения сводятся к 2D (XY), проще посчитать через барицентрические координаты и считать пересечение только если Z точки > Z пересечения

Vec3 p,a,b,c; // P против треуг A,B,C
float px=p.x-a.x,py=p.y-a.y;
float bx=b.x-a.x,by=b.y-a.y
float cx=c.x-a.x,cy=c.y-a.y;
// px=u*bx+v*cx
// py=u*by+v*cy
float u=px*cy-py*cx;
float v=px*by-py*bx;
float d=bx*cy-by*cx;
n+=(u>=0&&v>=0&&u+v<=d&&(p.z-a.z)*d>=u*(b.z-a.z)+v*(c.z-a.z)); // число пересечений
ПрограммированиеФорумОбщее

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