Как я могу получить UV координаты прямоугольника в 3D с помощью метода трассировки лучей? - PullRequest
0 голосов
/ 01 мая 2019

Я сейчас работаю над трассировкой лучей. У меня проблема с коллизиями. Я не могу понять, как получить точку пересечения луча и плоскости, если быть более точным, моя проблема не в том, чтобы определить точку пересечения луча и плоскости, проблема в том, чтобы преобразовать эту координату в координату ультрафиолетового излучения (этот прямоугольник можно повернуть в любом случае в мире ) для наложения текстур. Я знаю одну точку на этом прямоугольнике, ее нормаль и границы.

1 Ответ

1 голос
/ 02 мая 2019

У нас есть 4 вершины прямоугольника, лежащие на сфере:

A - top left
B - top right
C - bottom right
D - bottom left

Центр сферы:

O

И точка пересечения на сфере внутри прямоугольника ABCD:

I

Идея состоит в том, чтобы идентифицировать все стороны треугольника AID, потому что это позволит нам узнать координаты точки I на плоскости.Таким образом, если мы переместим прямоугольник на плоскости с A(0, rect.height) и D(0, 0), то точку I можно будет найти, решив следующую систему уравнений:

x^2+y^2=DI^2               - circle equation with center in point D and radius DI
x^2+(y-rect.height)^2=AI^2 - circle equation with center in point A and radius AI

, из которой следует, что:

y = (DI^2-AI^2+rect.height) / (2*rect.height)

и x могут иметь 2 значения (положительное и отрицательное), однако нас интересует только положительное значение, потому что только оно будет внутри прямоугольника.

x = sqrt(DI^2-(DI^2-AI^2+rect.height)/(2*rect.height))

Тогда UVможно вычислить следующим образом uv(x/rect.width, y/rect.height)

Однако длина AI и DI до сих пор неизвестна, но можно рассчитать по формуле Расстояние по большому кругу

AI = (Radius of the Sphere) * (Angular orthodromy length must be in radians)
Radius of the Sphere = sqrt((O.x - A.x)^2+(O.y - A.y)^2+(O.z - A.z)^2)
Angular orthodromy length = arccos(sin(a1)*sin(a2)+cos(a1)*cos(a2)*cos(b2-b1))

a1 is angle AOA1,  where A1(A.x, O.y, A.z)
b1 is angle O1OA1, where O1(O.x, O.y, A.z)
a2 is angle IOI1,  where I1(I1.x, O.y, I.z)
b2 is angle O2OI1, where O2(O.x, O.y, I.z)
...