Math 将三维三角形内的点插值到二维三角形内的点

Math 将三维三角形内的点插值到二维三角形内的点,math,language-agnostic,3d,Math,Language Agnostic,3d,有人能告诉我解决这个问题的算法吗: 给定一个三维三角形(p0,p1,p2)和该三角形(px)内/上的一个三维点以及一个二维三角形(p0',p1',p2'),函数将返回一个二维点,以便: 如果px==p0,则返回p0' 如果px==p1,则返回p1' 如果px==p2,则返回p2' 基本上,你想把一个3D点投影到一个2D矩阵上,对吗 这方面有很多资源(在这里查看维基百科),但这是一个很好的介绍 编辑:这篇最近的文章也是一篇非常易懂的介绍我理解。在(p0,p1,p2)平面上的任何点px)都可以用

有人能告诉我解决这个问题的算法吗:

给定一个三维三角形(p0,p1,p2)和该三角形(px)内/上的一个三维点以及一个二维三角形(p0',p1',p2'),函数将返回一个二维点,以便:

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

基本上,你想把一个3D点投影到一个2D矩阵上,对吗

这方面有很多资源(在这里查看维基百科),但这是一个很好的介绍


编辑:这篇最近的文章也是一篇非常易懂的介绍

我理解。在(
p0
p1
p2
)平面上的任何点
px
)都可以用坐标
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]

挑战:做一个不是2d的三角形…“以及介于两者之间的一切”:这意味着什么?如果你用重心坐标表示你的点,其余的应该是微不足道的。除非我不明白你的要求。