Как сделать пересечение плоскости луча?
Как вычислить пересечение между Лучом и плоскостью? Я посещал все возможные веб-сайты, которые я могу найти, и это то, чего я достиг до сих пор:
float denom = normal.dot(ray.direction);
if (denom > 0)
{
float t = -((center - ray.origin).dot(normal)) / denom;
if (t >= 0)
{
rec.tHit = t;
rec.anyHit = true;
computeSurfaceHitFields(ray, rec);
return true;
}
}
Это не работает :s
Моя функция ввода:
ray: который содержит начало и направление.
rec: класс контейнера для хранения информации о попадании (bool, t и т. д.)
моя функция имеет доступ к самолету:
point: точка, определяющая плоскость
нормальный: Нормаль, которая определяет плоскость
2 ответов
Как прокомментировал вонс, вы также хотите, чтобы знаменатель был отрицательным, иначе вы пропустите пересечения с передней гранью вашей плоскости. Однако вы все равно хотите, чтобы тест избегал деления на ноль, что указывало бы, что луч параллелен плоскости. У вас также есть лишнее отрицание в вашем вычислении t
. В целом, это должно выглядеть так:
float denom = normal.dot(ray.direction);
if (abs(denom) > 0.0001f) // your favorite epsilon
{
float t = (center - ray.origin).dot(normal) / denom;
if (t >= 0) return true; // you might want to allow an epsilon here too
}
return false;
сначала рассмотрим математику пересечения плоскости луча:
В общем случае пересекается параметрическая форма луча с неявной формой геометрии.
Итак, дан луч вида x = a * t + a0, y = b * t + b0, z = c * t + c0;
и плоскость вида: a x * B y * C z + D = 0;
теперь подставим уравнения x, y и z лучей в плоское уравнение, и вы получите многочлен в t. затем вы решаете этот многочлен для реальные значения t. С этими значениями t вы можете вернуться в уравнение луча, чтобы получить реальные значения x, y и z. Вот она в Максиме:
обратите внимание, что ответ выглядит как фактор двух точечных продуктов! Нормалью к плоскости являются первые три коэффициента плоского уравнения A, B и C. Вам все равно нужно D, чтобы однозначно определить плоскость. Затем вы кодируете это на выбранном вами языке следующим образом:
Point3D intersectRayPlane(Ray ray, Plane plane)
{
Point3D point3D;
// Do the dot products and find t > epsilon that provides intersection.
return (point3D);
}