将3d三角形内的点插值到2d三角形内的点

时间:2012-02-07 15:03:08

标签: math language-agnostic 3d

有人可以给我算法来解决这个问题:

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

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

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

2 个答案:

答案 0 :(得分:0)

基本上,您想要将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/

答案 1 :(得分:0)

我明白。 (pxp0p1)平面上的任何点p2均可由BaryCentric坐标a0,{{1}表示},a1,使a2在所有坐标中。如果您知道px = a0*p0 + a1*p1 + a2*p2a0a1的值,那么您可以按顺序将它们应用于(a2p0'p1')找到p2'

要获得BaryCentric坐标,您需要求解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

将2D点的坐标设为:

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;
相关问题