如何在三维中细分三角形?

时间:2014-10-08 14:48:35

标签: c opengl linear-algebra

我有一个需要3个点的函数,我将使用这些点绘制一个三角形,就像我使用glVertex函数一样。

但是因为我想在避免透视失真的同时对这个三角形进行纹理贴图,我必须将其细分,并使用顶点进行纹理映射和法线计算。

我设法为矩形,球体,圆柱体和圆环做了这个,但我不能,因为我的生活,弄清楚如何做三角形。

我设法找到的每个三角形映射示例仅用于2D空间和预定义点,使用glVertex。

对于矩形,我正在使用的代码就是这个:

void Rectangle::draw(float texS, float texT)
{
float x1, x2, y1, y2;
x1 = v.at(0); x2 = v.at(2);
y1 = v.at(1); y2 = v.at(3);
//glRectf(x1,y1,x2,y2);

int _numDivisions = 100;
float _xDim = abs(x2 - x1);
float _yDim = abs(y2 - y1);

float texMultiS, texMultiT;
texMultiS = _xDim / texS;// / _xDim;
texMultiT = _yDim / texT;// / _yDim;

glPushMatrix();
    glTranslatef(x1, y1, 0);
    glRotatef(-90.0,1,0,0);
    glScalef( _xDim * (1.0/(double) _numDivisions), 1 , _yDim * (1.0/(double) _numDivisions));  
    glNormal3f(0,-1,0);

    for (int bx = 0; bx<_numDivisions; bx++)
    {
        glBegin(GL_TRIANGLE_STRIP);

            glTexCoord2f((bx * 1.0/_numDivisions) * texMultiS, 0.0 * texMultiT);
            glVertex3f(bx+x1, 0, 0+y1);

            for (int bz = 0; bz<_numDivisions; bz++)
            {
                glTexCoord2f(((bx+1) * 1.0/_numDivisions) * texMultiS, (bz * 1.0/_numDivisions) * texMultiT);
                glVertex3f((bx + 1)+x1, 0, bz+y1);

                glTexCoord2f(((bx+1) * 1.0/_numDivisions) * texMultiS, ((bz+1) * 1.0/_numDivisions) * texMultiT);
                glVertex3f(bx+x1, 0, (bz + 1)+y1);
            }
            glTexCoord2f(((bx+1) * 1.0/_numDivisions) * texMultiS, 1.0 * texMultiT);
            glVertex3d((bx+1)+x1, 0, _numDivisions+y1);             

        glEnd();
    }
glPopMatrix();
}

我得到了。这很简单,因为它在2D空间中。我的目标是同样的逻辑,但对于3D空间三角形。

但我无法弄清楚3D空间中三角形点所需的计算。

例如:

P1-&GT;(0,0,1); P2-&GT;(1,0,0); P3-&GT;(0,1,0);

到目前为止,我最好的想法是以P1为原点在2D空间中绘制它,我可以让P1-> P2线中的每个点向P3收敛,然后根据x-计算旋转角度轴,然后是y轴旋转的角度,但这真的是最好的方法吗?

编辑:

如下所述,重新解释问题的方法可能是: “我如何细分三维的一般三角形”?

由于目标是获得一个在三维空间中构建三角形(三角形条带或四边形条带)三角形的算法,因此我可以使用顶点进行纹理映射和正常计算。

1 个答案:

答案 0 :(得分:1)

正如评论中所建议的那样,你可以切出一个非常类似于四边形的三角形。有一些奇特的ASCII艺术:

           /|
          / |
         ----
        /| /|
       / |/ |
      -------
     /| /| /|
    / |/ |/ |
   ----------
  /| /| /| /|
 / |/ |/ |/ |
-------------

将其分解成从下到上的三角形条带,我们将有4个条带。 4条带的三角形数量为:

1, 3, 5, 7
条带2 * i + 1

ii0的{​​{1}}。

要计算细分所需的顶点,可以通过相应的两个顶点之间的线性插值计算底边的点。对于沿图中对角线的边缘点的点也是如此。然后沿着每个条带,再次在相应的两个点之间进行线性插值,将条带n - 1的左侧分成i个片段,将右侧分成i个片段。