2016-10-23 6 views
-2

так, что мне нужно сделать Ray-AABB пересечение Вот мой код, взятый из книгиRay-ААББ пересечение

bool intersection(point start, point dir){ 
    float tmax, tmin, tmaxY, tminY, tmaxZ, tminZ; 
    float a; 
    point temp1, temp2; 

    //check x 
    a = 1/dir[0]; 
    if(a > 0){ 
     tmax = (max[0] - start[0]) * a; 
     tmin = (min[0] - start[0]) * a; 
    }else{ 
     tmax = (min[0] - start[0]) * a; 
     tmin = (max[0] - start[0]) * a; 
    } 
    if(tmin > tmax) return false; 

    //check y 
    a = 1/dir[1]; 
    if(a > 0){ 
     tmaxY = (max[1] - start[1]) * a; 
     tminY = (min[1] - start[1]) * a; 
    }else{ 
     tmaxY = (min[1] - start[1]) * a; 
     tminY = (max[1] - start[1]) * a; 
    } 
    if(tminY > tmin) tmin = tminY; 
    if(tmaxY < tmax) tmax = tmaxY; 
    if(tmin > tmax) return false; 

    //check z 
    a = 1/dir[2]; 
    if(a > 0){ 
     tmaxZ = (max[2] - start[2]) * a; 
     tminZ = (min[2] - start[2]) * a; 
    }else{ 
     tmaxZ = (min[2] - start[2]) * a; 
     tminZ = (max[2] - start[2]) * a; 
    } 
    if(tminZ > tmin) tmin = tminZ; 
    if(tmaxZ < tmax) tmax = tmaxZ; 
    if(tmin > tmax) return false; 

    return true; 
} 

однако, это не работает для меня. Пересечение Возвращен ложь (сог tminY> Tmin, но меньше, чем Tmax), когда предполагается вернуть истинный (испытано без ААВВ ограничивающей)

Наблюдения:

start(0, 0, 5) and dir(-89.5, -99.5, -100) 
    bounding box: max(-5, 0, 0) and min(-5, -5, 0) 
    tmin = 0.055865921 
    tmax = 0.055865921 
    tminY = 0 
    tmaxY = 0.050251257, therefor tmax = 0.050251257 
    Because tmin > tmax -> return false 
    It is supposed to be true 

Любая помощь будет оценена

+1

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Как только вы выполните домашнее задание отладки, просто для удовольствия: проверьте, как фрагмент кода выше реагирует на пересечение по осям Ox/Oy/Oz (подсказка: поплавковое деление на ноль). –

+0

@ πάντα ῥεῖ Я отлаживал его. Это действительно дает tminY, что больше tmax, поэтому я спросил в Stack Overflow. Если вы нашли ошибку в моем коде, скажите, пожалуйста, – RLin

ответ

1
// a degenerated bounding box, actually a segment parallel 
// with the yAxis, with a length of -5 and starting in (x,z)=(-5, 0) 
// Because: 
// xMin=xMax=-5 - so a zero x extent 
// zMin=zMax=0 - so a zero x extent 
bounding box: max(-5, 0, 0) and min(-5, -5, 0) 

Вы уверены, что это то, что вы хотите? Проверьте, пересекает ли луч сегмент?

+0

Не совсем, Но в этом случае у меня есть только 4 лица, и все они находятся на одинаковых координатах Z. Я также проверил вышеуказанный код с teapot.obj, но также не работал на некоторых частях. – RLin

+0

^(забыл упомянуть ваше имя) – RLin

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