Пересечение луча и сферы


 


bool RaySphereIntersection(float3 ray_pos, float3 ray_dir, float3 spos, float r, float& tResult)

{

  //a == 1; // because rdir must be normalized

  float3 k = ray_pos - spos;

  float b = dot(k,ray_dir);

  float c = dot(k,k) - r*r;

  float d = b*b - c;

 

  if(d >=0)

  {

    float sqrtfd = sqrtf(d);

    // t, a == 1

    float t1 = -b + sqrtfd;

    float t2 = -b - sqrtfd;

 

    float min_t  = min(t1,t2);

    float max_t = max(t1,t2);

 

    float t = (min_t >= 0) ? min_t : max_t;

    tResult = t;

    return (t > 0);

  }

}





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

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

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

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

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

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

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

GPU ray tracing

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

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

OpenSource RTRT

Siberian renderer

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

Hydra renderer

AdaRT

Публикации

Загрузить

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

ССЫЛКИ

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

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