【问题标题】:Interpolate point within a 3d triangle to a point within a 2d triangle将 3d 三角形内的点插值到 2d 三角形内的点
【发布时间】:2012-02-29 00:22:27
【问题描述】:

谁能给我解决这个问题的算法:

给定一个 3D 三角形 (p0, p1, p2) 和这个三角形内部/上的一个 3D 点 (px) 和一个 2D 三角形 (p0', p1', p2'),该函数将返回一个 2D 点,使得:

  • 如果 px == p0 则返回 p0'
  • 如果 px == p1 则返回 p1'
  • 如果 px == p2 则返回 p2'

以及介于两者之间的一切。

【问题讨论】:

  • 挑战:制作一个不是二维的三角形...
  • “以及介于两者之间的所有内容”:这是什么意思?
  • 如果你用重心坐标表达你的观点,其余的应该是微不足道的。除非我不明白你在问什么。

标签: math language-agnostic 3d


【解决方案1】:

我明白了。 (p0,p1,p2) 平面上的任何点px 都可以用BaryCentric 坐标a0,a1,a2 表示,这样所有坐标中的px = a0*p0 + a1*p1 + a2*p2。如果您知道 a0,a1,a2 的值,则可以将它们应用于 (p0',p1',p2') 以找到 px' = a0*p0' + a1*p1' + a2*p2'

要获得重心坐标,您需要求解 3x3 线性方程组

| px[0] |   | p0[0]  p1[0]  p2[0] | | a[0] |
| px[1] | = | p0[1]  p1[1]  p2[1] | | a[1] |
| px[2] |   | p0[2]  p1[2]  p2[1] | | a[2] |

C 解决方案是

d = p0[0]*p1[1]*p2[2]-p0[0]*p1[2]*p2[1]-p0[1]*p1[0]*p2[2]+p0[1]*p1[2]*p2[0]+p0[2]*p1[0]*p2[1]-p0[2]*p1[1]*p2[0];
a0 = (p1[0]*p2[1]*px[2]-p1[0]*p2[2]*px[1]-p1[1]*p2[0]*px[2]+p1[1]*p2[2]*px[0]+p1[2]*p2[0]*px[1]-p1[2]*p2[1]*px[0])/d;
a1 = -(p0[0]*p2[1]*px[2]-p0[0]*p2[2]*px[1]-p0[1]*p2[0]*px[2]+p0[1]*p2[2]*px[0]+p0[2]*p2[0]*px[1]-p0[2]*p2[1]*px[0])/d;
a2 = (p0[0]*p1[1]*px[2]-p0[0]*p1[2]*px[1]-p0[1]*p1[0]*px[2]+p0[1]*p1[2]*px[0]+p0[2]*p1[0]*px[1]-p0[2]*p1[1]*px[0])/d;

二维点的坐标为:

px'[0] = a0*p0'[0] + a1*p1'[0] + a2*p2'[0]
px'[1] = a0*p0'[1] + a1*p1'[1] + a2*p2'[1]
px'[2] = a0*p0'[2] + a1*p1'[2] + a2*p2'[2]

【讨论】:

    【解决方案2】:

    基本上,您想将 3D 点投影到 2D 矩阵,对吗?

    这方面有很多资源(在此处查看维基百科http://en.wikipedia.org/wiki/3D_projection)但是这个http://www.flipcode.com/archives/Plotting_A_3D_Point_On_A_2D_Screen.shtml 是一个很好的介绍!

    编辑:最近这篇文章也是一个很好理解的介绍http://creativejs.com/2012/01/day-12-3d-pixel-particles/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 2021-09-14
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多