我需要将一个3D物体投射到球体的表面上(嗯......就像投射阴影一样)。
AFAIR这应该可以使用投影矩阵。
如果“阴影接收器”是一个平面,那么我的投影矩阵将是3D到2D平面投影,但在这种情况下我的接收器是3D球面。
所以给定sphere1(中心点,半径),sphere2(othercenter,otherradius)和eyepoint我怎样才能计算出一个矩阵,它将所有点从sphere2投射到sphere1上(如投射阴影)。
答案 0 :(得分:4)
您的意思是给定顶点v
您需要以下投影:
v'= centerpoint + (v - centerpoint) * (radius / |v - centerpoint|)
使用投影矩阵无法做到这一点。你可以在着色器中轻松完成它。
答案 1 :(得分:2)
矩阵通常用于表示线性运算,例如投影到平面上。 在您的情况下,使用线性函数不会从输入推导出结果顶点,因此使用矩阵无法进行此投影。
答案 2 :(得分:2)
如果sphere1是球体((0,0,0),1),也就是半径为1的球体以原点为中心,那么你实际上是想要一种转换任何位置的方法(x, y,z)在3D中到单位球面上的相应位置(x',y',z')。这相当于向量重整化:(x',y',z')=(x,y,z)/ sqrt(x ^ 2 + y ^ 2 + z ^ 2)。
如果sphere1不是单位球体,而是球体((a,b,c),R)你可以做大部分相同的事情: (x',y',z')= R *(x-a,y-b,z-c)/ sqrt((x-a)^ 2 +(y-b)^ 2 +(z-c)^ 2)+(a,b,c)。这相当于改变坐标,因此第一个球体是单位球体,解决问题,然后改变坐标。
正如人们所指出的,这些函数是非线性的,因此投影不能称为“矩阵”。但如果您因某种原因首选投影矩阵,则可以首先从3D投影到平面,然后从平面投射到球体。我不确定那会不会更好。
最后,让我指出线性地图不会产生被零除错误,但如果仔细观察上面的公式,你会看到这张地图可以。几何上,这是因为很难将球体的中心点投射到其边界。