вопрос в следующем:
как наыти точку пересечения геометрического объекта(примитива) и луча? примитивы: плоскость сфера цилинтр конус паралелепипед полигон и как это будет выглядеть в коде. или хотябы с математической форме? |
Vlad Drakula
Это задача из курса аналитической геометрии. Луч (т.е. прямая) описывается парой уравнений плоскостей: ax+by+cz=d, Ax+By+Cz=D. Это два уравнения из трех. Твой примитив д.б. описан в виде уравнения: F(x,y,z)=E. Вот тебе третье уравнение. Решаешь их совместно, получаешь общие точки. :) |
это понятно, это самое простое.
Если кому интересно то вот реализация: 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; } а для остальных объектов??? |
2 Vlad Drakula
вот уж не знаю самому проще написать или попробовать догадаться кто такие Ray и ему подобные ... ;)) |
Время: 23:55. |
Время: 23:55.
© OSzone.net 2001-