2015-12-01 19 views
0

Я работаю над трассировкой лучей и решил использовать ограничивающие прямоугольники (выровненные по оси bbox) объекты (кубы) и затенять их. Я могу найти правильное значение t и точку пересечения; однако я не мог найти способ вычисления нормали поверхности, так как у меня есть только ray direction, ray origin, intersection point и t value и min-max значения bbox.Расчет нормального уровня Bbox/Cube

Есть ли способ вычислить нормальное значение в точке пересечения (или решить, какая грань луча куба пересекается) с информацией, которую у меня есть?

Я использую «Эффективный и надежный алгоритм пересечения лучей» Уильямса и др.

ответ

0

Если у вас есть точка пересечения и центр AABB (BoundingBox), вы можете сделать быстрый расчет, чтобы получить индекс, соответствующий лицу, которое вы нажмете.

Затем с массивом, в котором хранятся нормали, вы можете получить свои данные.

Vector3 ComputeNormal(Vector3 inter, Vector3 aabbCenter) 
{ 
    static const Vector3 normals[] = { // A cube has 3 possible orientations 
     Vector3(1,0,0), 
     Vector3(0,1,0), 
     Vector3(0,0,1) 
    }; 
    const Vector3 interRelative = inter - aabbCenter; 
    const float xyCoef = interRelative.y/interRelative.x; 
    const float zyCoef = interRelative.y/interRelative.z; 

    const int coef = (isBetweenInclusive<1,-1>(xyCoef) ? 1 : 
         (isBetweenExclusive<1,-1>(zyCoef) ? 2 : 0)); 
    // Here it's exclusive to avoid coef to be 3 
    return normals[coef] * SIGN(interRelative); // The sign he is used to know direction of the normal 
} 

Я не проверял это, так что не удивляйтесь, если он не работает напрямую;), но он должен сделать трюк.

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

  • Нет связанных вопросов^_^