Я реализую некоторый код, связанный с усечками, и тест отбраковки ничего не возвращает, даже когда есть много видимых объектов. Моя библиотека математической поддержки не обеспечивает поддержку самолета или что-то в этом роде, поэтому большая часть этого кода написана с нуля с небольшим количеством доступных тестов. Если у вас есть какие-либо предложения относительно точки отказа, пожалуйста, сообщите нам. К счастью, там не много, так 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
.
Серьезно? Вы пишете «вот мой код, где ошибка?» вопрос? –
Это помогает, если вы опишете, как вы проиндексировали ваши верхушки усеченного конуса. –
@Oli: Что еще я могу предложить? Например, у меня нет каких-либо предупреждений или ошибок компилятора, и я уверен, что не понимаю этого достаточно хорошо, чтобы понять что-либо, что я могу увидеть в отладчике. – Puppy