Я пишу трассировщик лучей на java, и мне удалось получить работающую трассировку сфер, но я считаю, что у меня что-то не так с тем, как я отслеживаю треугольники.
Вот основной алгоритм, насколько я понимаю:
- Сначала определите, пересекает ли луч даже плоскость, на которой находится треугольник.
- Обрежьте все точки так, чтобы они находились на той же плоскости, что и треугольник (например, на плоскости
xy
). - Определите, попадает ли потенциальная точка пересечения внутрь или за пределы треугольника, основываясь на количестве ребер многоугольника, которые вы пересекаете при отправке луча в произвольном направлении вдоль новой плоскости.
Теперь вот моя реализация этого (в частности, первая точка):
public Vector getIntersectionVector(Ray ray)
{
Vector planeIntersectionVector = getPlaneIntersectionVector(ray, getPlaneNormal());
if (planeIntersectionVector != null)
{
if (isIntersectionVectorInsideTriangle(planeIntersectionVector))
{
return planeIntersectionVector;
}
else
{
return null;
}
}
else
{
return null;
}
}
Где getPlaceIntersectionVector()
:
private Vector getPlaneIntersectionVector(Ray ray, Vector planeNormal)
{
double vd = planeNormal.dotProduct(ray.getDirection());
//(p_n \dot r_d) == 0, parallel. (p_n \dot r_d) > 0 Plane normal pointing away from ray.
if (vd >= 0)
{
return null;
}
double distance = planeNormal.distance(0d, 0d, 0d);
double vo = -(planeNormal.dotProduct(ray.getOrigin()) + distance);
double intersectionDistance = vo / vd;
//intersectionDistance <= 0 means the "intersection" is behind the ray, so not a real intersection
return (intersectionDistance <= 0) ? null : ray.getLocation(intersectionDistance);
}
Что в основном пытается имитировать это:
Где t
- расстояние вдоль луча, на которое попадает точка, r o - начало луча, r d - направление луча, p n относится к плоскости, перпендикулярной треугольнику / плоскости, а d
- это расстояние от плоскости, на которой находится треугольник, до начала координат (0,0,0)
Я что делаю неправильно? Когда я отправляю луч из первого пикселя изображения (0,0)
, я вижу, что intersectionDistance
(или t
) почти 1100
, что интуитивно кажется мне неправильным. Думаю, точка пересечения будет намного ближе.
Вот соответствующие данные: начало луча (0,0,1)
, направление луча примерно (0.000917, -0.4689, -0.8833)
.
Треугольник имеет вершины как (-0.2, 0.1, 0.1)
, (-0.2, -0.5, 0.2)
, (-0.2, 0.1, -0.3)
, что делает плоскость нормальной (-1, 0, 0)
.
Согласно моему коду, луч пересекает плоскость 1090
расстояние, которое, как я упоминал ранее, кажется мне неправильным. Сцена только от -1,0 до 1,0 во всех направлениях, что означает, что пересечение очень-очень далеко.
Я неправильно делаю пересечение плоскостей?
Пожалуйста, дайте мне знать, где уточнить моменты, и если вам нужна дополнительная информация.