PDA

Показать полную графическую версию : Геометрические объекты.


Vlad Drakula
04-01-2004, 21:47
вопрос в следующем:

как наыти точку пересечения геометрического объекта(примитива) и луча?

примитивы:
плоскость
сфера
цилинтр
конус
паралелепипед
полигон

и как это будет выглядеть в коде.
или хотябы с математической форме?

shurikan
05-01-2004, 01:35
Vlad Drakula
Это задача из курса аналитической геометрии. Луч (т.е. прямая) описывается парой уравнений плоскостей:
ax+by+cz=d,
Ax+By+Cz=D.
Это два уравнения из трех. Твой примитив д.б. описан в виде уравнения:
F(x,y,z)=E.
Вот тебе третье уравнение. Решаешь их совместно, получаешь общие точки.
:)

Vlad Drakula
06-01-2004, 19:41
это понятно, это самое простое.

Если кому интересно то вот реализация:

int Plane::Intersect( Ray& ray, double& t)
{
 double vd = n&ray.Dir;

 if(vd > -EPS && vd < EPS)
   return 0;

 t = - (( n&ray.Org ) + D )/vd;

 return t > GeomThreshold;
}

Соответственно для сферы:

int Sphere::Intersect( Ray& ray, double& t)
{
 Vector l = Loc - ray.Org;
 double L2OC = l&l;
 double tca = l&ray.Dir;
 double t2hc = Radius - L2OC + tca*tca;
 double t2;

 if( t2hc <= 0.0 )
   return 0;

 t2hc = sqrt( t2hc );

 if ( tca < t2hc)
 {
   t = tca + t2hc;
   t2 = tca - t2hc;
 }
 else
 {
   t = tca - t2hc;
   t2 = tca + t2hc;
 }

 if( fabs (t) < GeomThreshold )
   t = t2;

 return t > GeomThreshold;
}

а для остальных объектов???

Guest
09-01-2004, 20:00
2 Vlad Drakula
вот уж не знаю самому проще написать или попробовать догадаться кто такие Ray и ему подобные ... ;))




© OSzone.net 2001-2012