如何使用射线追踪方法获得3D中矩形的UV坐标?

时间:2019-05-01 19:41:45

标签: math geometry raytracing

我目前正在从事射线追踪。我在查看Ray碰撞时遇到问题。我无法弄清楚如何获得射线与平面的交点,更确切地说,我的问题不是搞清楚射线与平面的交点,问题是将这个坐标转换为uv坐标(这个矩形可以在世界上任意旋转)进行纹理映射。我知道这个矩形上的一个点,它的法线和边界。

1 个答案:

答案 0 :(得分:1)

我们在球体上有一个矩形的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个值(正值和负值),但是我们只对正值感兴趣,因为只有正值才会在rect内部。

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

然后可以按照以下方式计算紫外线uv(x/rect.width, y/rect.height)

AIDI的长度仍然未知,但是可以使用Great-circle distance的公式进行计算

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)