Math 如何将光线平面交点转换为重心坐标?

Math 如何将光线平面交点转换为重心坐标?,math,intersection,raytracing,Math,Intersection,Raytracing,我的问题: 如何获取两个3D点并将其锁定到单个轴?例如,使其两个z轴都为0 我想做什么: 我在场景中有一组3D坐标,表示一个有金字塔的盒子。我还有一个摄像头,由另一个3D坐标表示。我从场景坐标中减去摄影机坐标并对其进行规格化,返回指向摄影机的向量。然后,我将光线平面与摄影机点后面的平面相交 O + tD 其中O(原点)是摄影机位置,D是从场景点到摄影机的方向,t是光线从摄影机点与平面相交所需的时间 O + tD 如果这不合理,这里有一张粗略的图: 我已经搜索了很多地方,据我所知,这叫做使用

我的问题:

如何获取两个3D点并将其锁定到单个轴?例如,使其两个z轴都为0

我想做什么:

我在场景中有一组3D坐标,表示一个有金字塔的盒子。我还有一个摄像头,由另一个3D坐标表示。我从场景坐标中减去摄影机坐标并对其进行规格化,返回指向摄影机的向量。然后,我将光线平面与摄影机点后面的平面相交

O + tD
其中O(原点)是摄影机位置,D是从场景点到摄影机的方向,t是光线从摄影机点与平面相交所需的时间

O + tD
如果这不合理,这里有一张粗略的图:

我已经搜索了很多地方,据我所知,这叫做使用“针孔相机”

问题不在于我的相机旋转,我已经排除了。问题在于将交点转换为重心(uv)坐标

x轴上的平移如下所示:

uaxis.x = -a_PlaneNormal.y;
uaxis.y = a_PlaneNormal.x;
uaxis.z = a_PlaneNormal.z;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d; 
uaxis.x = -a_PlaneNormal.z;
uaxis.y = a_PlaneNormal.y;
uaxis.z = a_PlaneNormal.x;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d; 
z轴上的平移如下所示:

uaxis.x = -a_PlaneNormal.y;
uaxis.y = a_PlaneNormal.x;
uaxis.z = a_PlaneNormal.z;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d; 
uaxis.x = -a_PlaneNormal.z;
uaxis.y = a_PlaneNormal.y;
uaxis.z = a_PlaneNormal.x;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d; 

我的问题是:如何将射线平面交点转换为x轴和z轴上的重心坐标?

直线上点(p)的常用公式,从(p0)开始,向量方向(v)为:

包含(p1)和法线(n)的平面上的点(p)的标准为:

那么,plug&chug:

(p0 + t*v - p1).n = (p0-p1).n + t*(v.n) = 0

   ->  t = (p1-p0).n / v.n
   ->  p = p0 + ((p1-p0).n / v.n)*v
检查:

(p - p1).n = (p0-p1).n + ((p1-p0).n / v.n)*(v.n)
                   = (p0-p1).n + (p1-p0).n
                   = 0
如果要将Z坐标固定为特定值,则需要沿Z轴选择法线(该法线将定义平行于XY平面的平面)

那么,你有:

n = (0,0,1)

   ->  p = p0 + ((p1.z-p0.z)/v.z) * v
   ->  x and y offsets from p0 = ((p1.z-p0.z)/v.z) * (v.x,v.y)

最后,如果你正试图为3D计算机图形构建一个虚拟的“相机”,那么做这类事情的标准方法是。最终,使用齐次坐标比我上面写的那种特殊3D向量代数更简单(通常更快)。

我不明白你在“我的问题”下的问题是什么意思。将两个点锁定到一个轴上意味着什么?您是否正在寻找一种变换,该变换将沿轴对齐通过点的直线?此外,重心坐标仅适用于三角形或其他凸多边形。你是指垂直于上述轴的平面中的参数坐标吗?是的,我正在寻找一种变换,它将沿着轴对齐点。我不太熟悉数学术语,但我所说的“重心坐标”是指交点相对于平面原点的x和y偏移。平面被定义为空间中的一个点和一条法线,在所有意图和目的上都是无限的。如果我可以将两个点锁定到一个轴上,我可以简单地执行point2d=Vec3(intersection.x-origin.x,intersection.y-origin.y,0)。第二种方法解决了同样的问题。我只想感谢你的帮助。这对我来说真是一个难题,但我已经解决了答案在于根据相机的方向向量作为新的z轴来计算新的x轴和y轴。之后,它变成了一个简单的光线平面相交的问题,并用新的x轴和y轴点交点。