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

时间:2009-11-20 22:42:46

标签: math intersection raytracing

我的问题:

如何获取两个3D点并将它们锁定到单个轴?例如,它们的z轴都是0。

我正在尝试做什么:

我在场景中有一组3D坐标,表示一个带有金字塔的框。我还有一个相机,由另一个3D坐标代表。我从场景坐标中减去相机坐标并对其进行标准化,返回指向相机的矢量。然后,我与摄像机点后面的平面进行射线平面交叉。

O + tD

其中O(原点)是摄像机位置,D是从场景点到摄像机的方向,t是光线与摄像机点相交的时间。

如果这没有意义,这是一张粗略的图画:

Crude drawing

我的搜索范围很广,据我所知,这是用“针孔相机”调用的。

问题不在于我的相机旋转,我已经消除了这一点。麻烦在于将交叉点转换为重心(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; 

虽然z轴上的平移看起来像这样:

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轴上的重心坐标?

1 个答案:

答案 0 :(得分:3)

一行上的点(p)的通常公式,从(p0)开始,向量方向(v)是:

p = p0 + t*v

包含(p1)和正常(n)的平面上的点(p)的标准是:

(p - p1).n = 0

所以,插件&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计算机图形构建虚拟“相机”,那么执行此类操作的标准方法是homogeneous coordinates。最终,使用齐次坐标比我上面编写的特殊3D矢量代数更简单(通常更快)。