Проблемы с удалением усадьбы ограничивающей рамки

Мне не удается заставить работать правильную отбраковку усеченной кости. Я получил отличное предложение от кого-то по поводу точечного тестирования AABB, и оно отлично работает, но я дошел до точки, когда максимальное и минимальное точечное тестирование не всегда работают, потому что часто они будут не в пирамиде, а в плоскости из одного из стороны будут. Поэтому мне нужно перейти к обнаружению полного ограничивающего прямоугольника. У меня уже есть код, который проверяет ограничивающую рамку по плоскостям усеченной пирамиды, просто нужно настроить ограничивающую рамку.

Есть ли у кого-нибудь пример кода или идея, как это сделать. У меня есть две точки, с помощью которых я могу создать ограничивающую рамку: минимум x y и z и максимум x y и z.

Спасибо! :)


person Satchmo Brown    schedule 09.06.2011    source источник
comment
Вы спрашиваете, как получить AABB по минимальным и максимальным точкам? Или как получить минимальную и максимальную баллы от вашего объекта?   -  person John Calsbeek    schedule 10.06.2011
comment
Между прочим, проверка двух точек относительно плоскости эквивалентна проверке AABB относительно плоскости. Вам просто нужно правильно выбрать две точки (т.е. вместо использования минимальной и максимальной точек вам нужно выбрать ближайшую и самую дальнюю точку от плоскости).   -  person John Calsbeek    schedule 10.06.2011
comment
@Josh Calsbeek Спасибо за ответ. Как это сделать? И да, теперь с новым пониманием AABB, как мне получить его из моих минимальных / максимальных значений. Спасибо :)   -  person Satchmo Brown    schedule 10.06.2011
comment
AABB определяется минимальной и максимальной точками. Если код, который у вас уже есть, не использует другую форму для представления AABB, вам больше ничего не нужно делать, кроме как указать минимальную и максимальную точки.   -  person John Calsbeek    schedule 10.06.2011


Ответы (1)


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

Из моего собственного кода самолета (поэтому, если какой-либо самолет вернет -1, отрисовка будет отменена), я добавил несколько комментариев, чтобы его было легче понять:

    int Side(const Sphere &e) const {
        float d=Distance(e.center);
        if(d-e.radius>Epsilon) return 1; // inside
        if(d+e.radius<-Epsilon) return -1; // outside
        return 0; // crossing the plane
    }

    int Side(const Vector3f &v) const { 
        float d=Distance(v);
        if(d>Epsilon) return 1;
        if(d<-Epsilon) return -1;
        return 0;
    }


    int Side(const Box3f &c) const {
        Vector3f a,b;
        if(Normal.x>=0.0)  { a.x=c.min.x; b.x=c.max.x; }
            else { b.x=c.min.x; a.x=c.max.x; }
        if(Normal.y>=0.0)  { a.y=c.min.y; b.y=c.max.y; }
            else { b.y=c.min.y; a.y=c.max.y; }
        if(Normal.z>=0.0)  { a.z=c.min.z; b.z=c.max.z; }
            else { b.z=c.min.z; a.z=c.max.z; }

        int l1 = Side(a), l2= Side(b);

        if(l1==l2) return l1; // both in the same side
        return 0; // we have the object crossing the plane
    }
person user548569    schedule 20.06.2011