Math 点到球面的投影矩阵

Math 点到球面的投影矩阵,math,geometry,3d,Math,Geometry,3d,我需要将一个3D对象投影到球体的表面上(嗯,就像投射阴影一样) AFAIR这应该可以通过投影矩阵实现 如果“阴影接收器”是一个平面,那么我的投影矩阵将是一个3D到2D平面投影,但在本例中,我的接收器是一个3D球面 因此,给定sphere1(中心点,半径)、sphere2(其他中心,其他半径)和一个视点,我如何计算一个矩阵,将所有点从sphere2投影到sphere1上(如投射阴影)。您的意思是给定一个顶点v您需要以下投影: v'=中心点+(v-中心点)*(半径/| v-中心点) 这在投影矩阵中是

我需要将一个3D对象投影到球体的表面上(嗯,就像投射阴影一样)

AFAIR这应该可以通过投影矩阵实现

如果“阴影接收器”是一个平面,那么我的投影矩阵将是一个3D到2D平面投影,但在本例中,我的接收器是一个3D球面


因此,给定sphere1(中心点,半径)、sphere2(其他中心,其他半径)和一个视点,我如何计算一个矩阵,将所有点从sphere2投影到sphere1上(如投射阴影)。

您的意思是给定一个顶点
v
您需要以下投影:

v'=中心点+(v-中心点)*(半径/| v-中心点)


这在投影矩阵中是不可能的。不过,您可以在着色器中轻松完成此操作。

矩阵通常用于表示线性操作,例如投影到平面上。 在您的例子中,生成的顶点不是使用线性函数从输入中推导出来的,因此使用矩阵无法进行此投影。

如果球体1是球体((0,0,0),1),即半径为1的球体,以原点为中心,那么您实际上是在寻求将3D中的任何位置(x,y,z)转换为相应位置的方法(x',y',z')。这相当于向量重整化:(x',y',z')=(x,y,z)/sqrt(x^2+y^2+z^2)

如果sphere1不是单位球体,而是sphere((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投影到平面,然后从平面投影到球体。我不确定这是否会更好


最后,让我指出,线性贴图不会产生零误差除法,但是如果你仔细观察上面的公式,你会发现这个贴图可以。从几何角度来说,这是因为很难将球体的中心点投影到其边界。

好吧,我需要从一个视点(如光源)进行投影,但我喜欢在着色器中投影它的想法。我会尝试一下!你是说你想从光源通过顶点拍摄一条线,看看它击中球体的位置?在这种情况下,你必须解一个二次方程,但在着色器中也可以。我想我需要的似乎更像光线投射,而不是投影。我只是希望有一个我不知道的解决方案。如果投影是正交的(或平行的),答案的第一部分可能不正确。但它类似于透视投影。