我有一个函数需要3个点,我会用这些点来画一个三角形,就像我用的是glVertex函数一样。
但由于我想纹理映射这个三角形,同时避免透视失真,我必须细分它,并使用顶点纹理映射和计算法线。
我设法为长方形,球体,圆柱体和圆环做了这个,但我不能,为了我的生命,想办法做一个三角形。
我找到的每一个三角形映射的例子都只针对二维空间和预定义的点,使用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();
}

我得到了这个。它很简单,因为它在二维空间。我的目标是同样的逻辑,但三维空间三角形。
但我无法计算出三维空间中三角形中的点所需的计算。
例如:
P1->(0,0,1);P2->(1,0,0);P3->(0,1,0);
到目前为止,我最好的想法是用P1作为2D空间绘制它,我可以让P1--P2线中的每一点收敛到P3,然后根据X轴计算旋转角度,然后计算Y轴上的旋转角度,但这真的是最好的方法吗?
编辑:
如下文所述,重新表述这个问题的方法可能是:
“如何在三维中细分一般三角形”?
因为目标是得到一个在三维空间中分段(三角形条带或四边形条带)建立三角形的算法,所以我可以使用顶点进行纹理映射和法线计算。

最佳答案

正如评论中所建议的,您可以将一个非常类似于四边形的三角形分割开来。使用一些奇特的ASCII艺术:

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

将它分解成从下到上的三角形条带,我们将有4条。4条带的三角形计数为:
1, 3, 5, 7

2 * i + 1用于带i,带i0n - 1
要计算细分所需的顶点,可以通过相应两个顶点之间的线性插值计算沿底边的点。图中沿对角线的边上的点也是这样。然后沿着每个条带,在对应的两点之间再次进行线性插值,将条带i的左侧分割为i条带,将右侧分割为i + 1条带。

关于c - 如何将三角形 segmentation 为三个维度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26259893/

10-13 07:24