给定三角形T的顶点V1 (x1,y1,z1)
,V2 (x2,y2,z2)
,V3 (x3,y3,z3)
,如果我知道{{1},我必须通过它的x,y坐标找到一个点的z坐标位于三角形Tp (x,y)
的投影内。
实际上,3D中的三角形平面由等式(x1,y1), (x2,y2), (x3,y3)
定义,我可以找到Ax+By+Cz+D=0
问题是A,B,C,D太昂贵而无法在运行时计算:
z = (D-Ax-By)/C
是否可以使用opengl着色器计算A,B,C,D?是否有优化算法来查找平面系数?
答案 0 :(得分:6)
该技术称为重心坐标,但维基页面很难遵循 - 见http://www.alecjacobson.com/weblog/?p=1596
float calcY(vec3 p1, vec3 p2, vec3 p3, float x, float z) {
float det = (p2.z - p3.z) * (p1.x - p3.x) + (p3.x - p2.x) * (p1.z - p3.z);
float l1 = ((p2.z - p3.z) * (x - p3.x) + (p3.x - p2.x) * (z - p3.z)) / det;
float l2 = ((p3.z - p1.z) * (x - p3.x) + (p1.x - p3.x) * (z - p3.z)) / det;
float l3 = 1.0f - l1 - l2;
return l1 * p1.y + l2 * p2.y + l3 * p3.y;
}
来自http://www.gamedev.net/topic/597393-getting-the-height-of-a-point-on-a-triangle/的代码 - 仔细研究计算机图形与数学使用Y Z
PS。我不知道使用着色器的任何更快的版本。一个快速的脏+解决方案是使用基于顶点高度的颜色渲染三角形并选择X,Y处的像素颜色 - 实际上这在台式机上永远不会更快,不知道opengl -es