【问题标题】:How to find correct way to project point on triangle for drawing line on mesh?如何找到正确的方法在三角形上投影点以在网格上绘制线?
【发布时间】:2019-09-21 03:55:57
【问题描述】:

我有网格和 2 个点 - AB。每个点都位于网格的某个三角形上。主要目标是 - 使用 2 个点在网格上绘制 正确 线。当点位于具有不同平面的三角形上时 - 我在画线时遇到问题。

我做什么:

CurrentTriangle = A 点所在的三角形。

而 CurrentTriangle != 带 B 点的三角形:

将 B 投影(Bp) 到 CurrentTriangle:将 B 移动 -CurrentTriangle.normal * 到平面的距离。

找到三角形的出口点 - ABp 与三角形边的交点(将 3d 坐标转换为 2d 并找到交点,然后使用重心坐标得到 3d 交点)。

将结果位置移向位置 B 以找到新的 CurrentTriangle。

问题是将位置 B 正确地投影到 CurrentTriangle 的平面上。实际结果:

预期结果(红线):

【问题讨论】:

  • 我将再次问同样的问题,我在你之前的问题中问过:正确的行是什么?是测地线吗?为什么红线比黑线好?
  • @Nico Schertlera 正确的线条是在屏幕上笔直且不失真的线条。红线更好,因为用户设置了 2 个点并且应该看到一条线,而不是一条曲线
  • @KonstantinSaietskyi 可以使用相机中心、A、B形成的三角形的平面,对每条边做一个segment-plane相交,选择离B最近的相交。
  • 那么,这条路径可以不连续吗?想象一下,我们有一个更左侧的视点。我们看不到小轮辋。那么路径是否应该完全跳过这些三角形?直接在屏幕空间画线会不会更合适?
  • 然后做二维交集。获得 2D 点后,只需进行反投影。最简单的方法是记住边缘和边缘上的位置。请记住,透视投影不保留长度比,即两个顶点之间的线性插值必须考虑深度。如果路径被前面的其他面部分遮挡,您可能还需要在面中间停止路径。

标签: 3d geometry projection raycasting map-projections


【解决方案1】:

在世界空间坐标中工作(或者更好的是,以相机中心为原点的 3D 笛卡尔坐标,但无论您使用何种 3D 坐标系来表示所有数据)。假设您知道 A 和 B 在世界空间中的笛卡尔坐标(基本上将它们的齐次坐标除以它们各自的第四分量并去掉第四分量,现在是 1)。假设您也知道相机中心的笛卡尔坐标,请将该点称为 O。

想法是将由点 A、B、O 确定的平面与每个三角形相交,从包含 A 的平面开始,到包含 B 的平面结束。

  1. 首先,求平面 ABO 的法向量 N,它是 向量 OA 和 OB。

  2. 现在,从包含 A 的三角形开始。

    • 让三角形有顶点 U、V 和 W,同样用笛卡尔世界坐标书写。
    • 然后计算向量 UV 和 UW 的叉积向量 M。
    • 然后计算 N 和 M 的叉积,得到向量 K。
    • 检查与向量 AB 的 K 点积是否为正。如果不是,则将 K 乘以 -1。
    • 从点 A 开始跟随矢量 K 直到与三角形 UVW 的边缘相交。用 P 表示该点。
    • 作为这些步骤的结果,您选择了一个点 P 以及与三角形 UVW 共享 P 所在边的三角形。
  3. 重复以下过程:假设您在一个三角形 UVW 处,并且您已经确定了它的一条边上的点 P(例如,参见前面的步骤 2)。

    • 取向量 UV 和 UW 的叉积向量 M。
    • 取向量 N 和 M 的叉积向量 K。
    • 从点 P 开始沿着矢量 K 直到与三角形 UVW 的边缘相交(或者,如果您在最后一个三角形,直到到达点 B)。用 P 表示新的交点。
    • 点 P 位于三角形 UVW 的三个边之一上。取下一个三角形,它是与 UVW 共享 P 所在边的三角形。称这个新三角形为 UVW。
    • 继续重复第 3 步,直到到达 B 点所在的三角形 UVW。

编辑1: (算法中几何构造的解释)你有向量N = OA x OB垂直于平面OAB和向量M = UV x UW垂直于飞机UVW。那么L 两个平面OABUVW 的交线L 位于这两个平面上 一方面,L 位于平面OAB 上,因此从点O 投影到屏幕上作为线。另一方面,L 位于三角形UVW 的平面上。因此,线L 垂直于向量NM。因此,向量NM 的叉积向量K = N x M 垂直于它们两者,因此平行于线L(即向量K 与线L 对齐)。因此线L(位于三角形UVW 的平面上)由点P 和向量K 定义。

编辑2: (可能是算法的简化)

再次,在世界空间坐标中工作(或者更好的是,以相机中心为原点的 3D 笛卡尔坐标,但无论您拥有所有数据的 3D 坐标系)。假设您知道 A 和 B 在世界空间中的笛卡尔坐标以及三角剖分顶点的所有世界坐标。假设您也知道相机中心的笛卡尔坐标,请将该点称为 O。

想法是将由点 A、B、O 确定的平面与每个三角形相交,从包含 A 的平面开始,到包含 B 的平面结束。

这是几何理由。从包含 A 的三角形开始。让三角形有顶点 U、V 和 W,同样用笛卡尔世界坐标书写。想法是找出 UVW 的三个边中的哪一个在点 P 处与平面 OAB 相交,使得 AP 与 AB 的点积 AP.AB 为正数。它基本上是 3D 中的线与 3D 中的平面相交的公式。比如说,这里的线是由点 V 和 W 确定的,而平面是 OAB。那么平面方程为 N.(X-A) = 0,对于平面 OAB 上的任意点 X。这里 '。'是点积。线性方程为 X = V + t*(W-V)。因此,当我们将直线方程代入平面方程时,通过求解 t 可以找到交点: N.(V + t*(W-V) - A) = 0 很容易求解 t: t = ( N.(A-V) )/( N.(W-V) )
因此 OAB 和 UV 的交点 P 是 P = V + ((N.(A-V))/( N.(W-V)))*(W-V) 为了确保 P 在边缘,即它在 U 和 V 之间,我们必须检查 N.(W-V) /= 0 和 0

  1. 首先,求平面ABO的法向量N,它是向量OA和OB的叉积N = OA x OB

  2. 从包含 A 的三角形开始。让三角形有顶点 U、V 和 W,同样用笛卡尔世界坐标书写。

    • 计算点积N.(W-V) 并检查它是否不等于0。如果是,则选择三角形的另一条边,从第 2 步开始重新开始;
    • 计算t = ( N.(A-V) )/( N.(W-V) )。如果 t > 1 或 t
    • 计算P = V + t*(W-V);
    • 执行以下检查: (i) 计算叉积向量 OA x OP 和 OP x OB; (ii) 计算他们的点积(OA x OP).(OP x OB); (iii) 检查(OA x OP).(OP x OB) > 0。如果不是,则选择另一条边,然后从第 2 步开始重新开始;
    • 画出连接点A到点P的线段;
    • 取与三角形 UVW 共享 P 所在边的三角形。
    • 作为这些步骤的结果,您选择了一个点 P 以及与三角形 UVW 共享 P 所在边的三角形。
  3. 重复以下过程:假设你在一个三角形 UVW 上,并且你已经在它的一个边上确定了点 P,比如 VW(例如,参见前面的步骤 2)。我们需要找到 OAB 与平面 OAB 相交的两条边 UV 或 UW 中的哪一条(它应该与其中之一相交)。从边缘 UV 开始:

    • 计算N.(V-U) 并检查它是否不等于0。如果是,则选择另一条边UW,从第3步开始重新开始;
    • 计算t = ( N.(A-U) )/( N.(V-U) )。如果 t > 1 或 t
    • 计算P = U + t*(V-U);
    • 绘制连接旧点和新点 P 的线段(在我们的示例中,第一个在边缘 VW 上,第二个在边缘 UV 上);
    • 取与三角形 UVW 共享 P 所在边的三角形。
    • 点 P 位于三角形 UVW 的三个边之一上。取下一个三角形,它是与 UVW 共享 P 所在边的三角形。称这个新三角形为 UVW。
    • 继续迭代第 3 步,直到到达 B 点所在的三角形 UVW。

【讨论】:

  • 你能解释更多关于“从A点开始跟随向量K直到你与三角形UVW的边缘相交。用P表示那个点”?我们有向量 K,它从 ABO 法线垂直于三角形法线(UVW),如果我从 A 跟随向量 K,它不会移动到三角形边缘。 imgur.com/a/PxV1Jrm
  • @KonstantinSaietskyi 你有向量 N = OA x OB 垂直于 OAB 和向量 M = UV x UW 垂直于 UVW。那么两个平面 OAB 和 UVW 的交线 L 位于这两个平面上(特别是在三角形 UVW 的平面上),因此 L 垂直于 N 和 M。因此,向量 N 的叉积向量 K并且M垂直于它们,因此平行于线L(即矢量K与线L对齐)。因此线 L(位于三角形 UVW 的平面上)由点 P 和向量 K 定义。
  • @KonstantinSaietskyi 在您的图片上,您可能没有将矢量 OB 作为法线矢量 N 定义的一部分。当放置在 A 点时,矢量 K 在屏幕上的投影应与投影对齐线 AB 投射到屏幕上,因为 K 在三个空间中位于 OAB 平面上,并且 OAB 平面作为一条线投影到屏幕上。并且O点是视点(point of projection),而不是屏幕的中心。这也很重要。
  • @KonstantinSaietskyi 我在答案中添加了一个编辑,解释了几何形状。观察叉积取 3 次。此外,向量 N 在任何地方总是相同的。只有向量 M 随每个 3D 三角形而变化。
  • 对图片有误解,请上传新图片imgur.com/a/J2BPZwP。所以我们有向量 K,它垂直于 OAB 和 UVW 平面。我不明白的部分是如何使用 K 向量在三角形(UVW)边缘上找到点?
猜你喜欢
  • 2018-07-23
  • 2016-07-17
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多