У нас есть 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)