так, что мне нужно сделать 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
Любая помощь будет оценена
Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –
Как только вы выполните домашнее задание отладки, просто для удовольствия: проверьте, как фрагмент кода выше реагирует на пересечение по осям Ox/Oy/Oz (подсказка: поплавковое деление на ноль). –
@ πάντα ῥεῖ Я отлаживал его. Это действительно дает tminY, что больше tmax, поэтому я спросил в Stack Overflow. Если вы нашли ошибку в моем коде, скажите, пожалуйста, – RLin