我目前正在从事射线追踪。我在查看Ray碰撞时遇到问题。我无法弄清楚如何获得射线与平面的交点,更确切地说,我的问题不是搞清楚射线与平面的交点,问题是将这个坐标转换为uv坐标(这个矩形可以在世界上任意旋转)进行纹理映射。我知道这个矩形上的一个点,它的法线和边界。
答案 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)
AI
和DI
的长度仍然未知,但是可以使用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)