Пересечение луча и бокса


Переменная inv_dir должна содержать 1.0f/ray_dir.


bool RayBoxIntersection(float3 ray_pos, float3 inv_dir, float3 boxMin, float3 boxMax, float& tmin, float& tmax)

{

  float lo = inv_dir.x*(boxMin.x - ray_pos.x);

  float hi = inv_dir.x*(boxMax.x - ray_pos.x);

  tmin  = min(lo, hi);

  tmax = max(lo, hi);

 

  float lo1 = inv_dir.y*(boxMin.y - ray_pos.y);

  float hi1 = inv_dir.y*(boxMax.y - ray_pos.y);

  tmin  = max(tmin, min(lo1, hi1));

  tmax = min(tmax, max(lo1, hi1));

 

  float lo2 = inv_dir.z*(boxMin.z - ray_pos.z);

  float hi2 = inv_dir.z*(boxMax.z - ray_pos.z);

  tmin  = max(tmin, min(lo2, hi2));

  tmax = min(tmax, max(lo2, hi2));

 

  return (tmin <= tmax) && (tmax > 0.f);

}


* В CUDA рекомендуется использовать встроенные функции fminf, fmaxf.

 




<< Вернуться назад

Статьи и обзоры

Поиск пересечений

Обратная трассировка лучей

Быстрая трассировка лучей

Индустриальная основа

Фотореалистичная визуализация

GPU ray tracing

Сферические гармоники

Дружественные проекты:

OpenSource RTRT

Siberian renderer

Наши разработки

Hydra renderer

AdaRT

Публикации

Загрузить

Скриншоты и видео

ССЫЛКИ

© Copyright 2007 Владимир Фролов, Александр Фролов

При поддержке Лаборатории компьтерной графики и мультимедия ф-та ВМК МГУ
Создание сайта: Александр Фролов