Как сделать пересечение плоскости луча?

Как вычислить пересечение между Лучом и плоскостью? Я посещал все возможные веб-сайты, которые я могу найти, и это то, чего я достиг до сих пор:

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. Вот она в Максиме:

enter image description here

обратите внимание, что ответ выглядит как фактор двух точечных продуктов! Нормалью к плоскости являются первые три коэффициента плоского уравнения 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);
}