2012-04-08 2 views
0

Я реализую некоторый код, связанный с усечками, и тест отбраковки ничего не возвращает, даже когда есть много видимых объектов. Моя библиотека математической поддержки не обеспечивает поддержку самолета или что-то в этом роде, поэтому большая часть этого кода написана с нуля с небольшим количеством доступных тестов. Если у вас есть какие-либо предложения относительно точки отказа, пожалуйста, сообщите нам. К счастью, там не много, так Little'Wall'o'Code следующим образом:Код пересечения Frustum возвращает отрицательное значение

class Plane { 
    public: 
     Plane() { 
      r0 = Math::Vector(0,0,0); 
      normal = Math::Vector(0,1,0); 
     } 
     Plane(Math::Vector p1, Math::Vector p2, Math::Vector p3) { 
      r0 = p1; 
      normal = Math::Cross(p2 - p1, p3 - p1); 
     } 
     Math::Vector r0; 
     Math::Vector normal; 
    }; 
    class Frustum { 
    public: 
     Frustum(
      const std::array<Math::Vector, 8>& points 
      ) 
     { 
      planes[0] = Plane(points[0], points[1], points[2]); 
      planes[1] = Plane(points[4], points[5], points[6]); 
      planes[2] = Plane(points[0], points[1], points[4]); 
      planes[3] = Plane(points[2], points[3], points[6]); 
      planes[4] = Plane(points[0], points[2], points[4]); 
      planes[5] = Plane(points[1], points[3], points[5]); 
     } 
     Plane planes[6]; 
    }; 

     // http://www.cescg.org/CESCG-2002/DSykoraJJelinek/index.html 
     bool Intersects(Math::AABB lhs, const Frustum& rhs) const { 
      for(int i = 0; i < 6; i++) { 
       Math::Vector pvertex = lhs.TopRightFurthest; 
       Math::Vector nvertex = lhs.BottomLeftClosest; 
       if (rhs.planes[i].normal.x <= -0.0f) { 
        std::swap(pvertex.x, nvertex.x); 
       } 
       if (rhs.planes[i].normal.y <= -0.0f) { 
        std::swap(pvertex.y, nvertex.y); 
       } 
       if (rhs.planes[i].normal.z <= -0.0f) { 
        std::swap(pvertex.z, nvertex.z); 
       } 
       if (Math::Dot(nvertex - rhs.planes[i].r0, rhs.planes[i].normal) > 0.0f) { 
        return false; 
       } 
      } 
      return true; 
     } 

Следует также отметить, что я использую систему координат левой рукой, так что я перевернутой результат из (внутри функции Cross).

Редактировать: Как четко указано, я пропустил указатели вершин. Они индексируются так, что каждый бит указывает угол на одной оси, то есть 0 указывает правую, верхнюю и заднюю части в этом порядке.

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

+3

Серьезно? Вы пишете «вот мой код, где ошибка?» вопрос? –

+0

Это помогает, если вы опишете, как вы проиндексировали ваши верхушки усеченного конуса. –

+1

@Oli: Что еще я могу предложить? Например, у меня нет каких-либо предупреждений или ошибок компилятора, и я уверен, что не понимаю этого достаточно хорошо, чтобы понять что-либо, что я могу увидеть в отладчике. – Puppy

ответ

3

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

На мой взгляд, у вас есть нормали, указывающие в том же направлении, что и неправильно.

enter image description here

Так указания этих поверхностей против часовой стрелки вокруг нормали дает мне

0 1 2 
    5 4 7 
    1 5 6 
    4 0 3 
    3 2 6 
    1 0 4 

Ваш пример 0 1 2 и 4 5 6 урожайности 2 нормалей, указывающие на то же направление, когда они должны указывать в противоположных направлениях

+0

Переупорядочить мои самолеты, как вы указали, было большим улучшением, но пока я еще не вышел из леса. Отбраковка работает правильно в некоторых регионах, но не в других. Пойдем немного изменить его, так как индексы вершин несколько отличаются от ваших. В стороне - у меня есть система координат LH, требуется ли по часовой стрелке или против часовой стрелки? – Puppy

+0

Угадайте, что требуется по часовой стрелке. Я переупорядочил мои вершины в соответствии с вашими индексами, а затем я поменял первый и последний из каждого компонента, и теперь он работает! вы r winrar – Puppy

Смежные вопросы