Проблемы с отбраковкой усеченной коробки - PullRequest
3 голосов
/ 10 июня 2011

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

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

Спасибо! :)

1 Ответ

1 голос
/ 20 июня 2011

Вам нужно, чтобы плоскости фруструма смотрели внутрь (их нормали должны указывать на центр).Тогда сброс рендеринга можно выполнить, проверив, находится ли объект полностью за пределами одной из шести плоскостей усеченного тела.Вы можете сделать это с помощью сферы, 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
    }
...