【问题标题】:How can I turn a ray-plane intersection point into barycentric coordinates?如何将射线平面交点转换为重心坐标?
【发布时间】:2009-11-23 20:38:57
【问题描述】:

我的问题:

如何获取两个 3D 点并将它们锁定在一个轴上?例如,使它们的 z 轴均为 0。

我想做的事:

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

O + tD

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

如果这没有意义,这里是一个粗略的绘图:

我已经搜索了很多地方,据我所知,这被称为使用“针孔相机”。

问题不在于我的相机旋转,我已经消除了它。问题在于将交点转换为重心 (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 轴上的重心坐标?

【问题讨论】:

  • 我不明白你在“我的问题”下的问题是什么意思。将 2 个点锁定在一个轴上是什么意思?您是否正在寻找一种变换,它将通过沿轴的点对齐线?此外,重心坐标仅对三角形或可能的其他凸多边形有意义。您是指垂直于上述轴的平面中的参数坐标吗?
  • 是的,我正在寻找一种将点沿轴对齐的变换。我对数学术语不是很熟悉,但我所说的“重心坐标”是指交点相对于平面原点的 x 和 y 偏移。平面被定义为空间中的一个点和一个法线,并且对于所有意图和目的都是无限的。如果我可以将两个点锁定到一个轴,我可以简单地做 point2d = Vec3(intersection.x - origin.x, intersection.y - origin.y, 0)。第二种方法解决了同样的问题。

标签: math intersection raytracing


【解决方案1】:

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

p = p0 + t*v

在包含 (p1) 且法线 (n) 的平面上点 (p) 的判据是:

(p - p1).n = 0

所以,即插即用:

(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 矢量代数更简单(通常更快)。

【讨论】:

  • 我只想感谢您的帮助。这对我来说是一个非常困难的问题,但我想通了。 :) 答案在于根据相机的方向矢量作为新的 z 轴来计算新的 x 和 y 轴。之后,就变成了一个简单的射线平面相交问题,并用新的 x 和 y 轴点缀交点。
猜你喜欢
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2014-07-02
相关资源
最近更新 更多