有人可以给我算法来解决这个问题:
给定3D三角形(p0,p1,p2)和此三角形内部/上的3D点(px)和2D三角形(p0',p1',p2'),该函数将返回2D点,使得:
以及介于两者之间的一切。
答案 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)
我明白。 (px
,p0
,p1
)平面上的任何点p2
均可由BaryCentric坐标a0
,{{1}表示},a1
,使a2
在所有坐标中。如果您知道px = a0*p0 + a1*p1 + a2*p2
,a0
,a1
的值,那么您可以按顺序将它们应用于(a2
,p0'
,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;