C 如何在三维空间中细分三角形?

C 如何在三维空间中细分三角形?,c,opengl,linear-algebra,C,Opengl,Linear Algebra,我有一个取3个点的函数,我会用这些点画一个三角形,就像我在使用glVertex函数一样 但是,由于我想对这个三角形进行纹理贴图,同时避免透视失真,所以我必须对它进行细分,并使用顶点进行纹理贴图和法线计算 我设法对矩形、球体、圆柱体和圆环体做了这项工作,但我一生都搞不懂如何做三角形 我找到的每个三角形映射示例都仅适用于二维空间,并使用glVertex预定义点 至于矩形,我使用的代码是: void Rectangle::draw(float texS, float texT) { float x1,

我有一个取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();
}
void Rectangle::draw(浮点文本、浮点文本)
{
浮球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;
浮点数xDim=abs(x2-x1);
浮动_yDim=绝对值(y2-y1);
浮动texmulti,texmulti;
texMultiS=\u xDim/texS;//\u xDim;
texmulti=_yDim/texT;///_yDim;
glPushMatrix();
glTranslatef(x1,y1,0);
glRotatef(-90.0,1,0,0);
glScalef(_xDim*(1.0/(双)_numDivisions),1,_yDim*(1.0/(双)numDivisions));
glNormal3f(0,-1,0);

对于注释中建议的(int bx=0;bx,您可以将一个非常类似于四边形的三角形切分。使用一些奇特的ASCII艺术:

           /|
          / |
         ----
        /| /|
       / |/ |
      -------
     /| /| /|
    / |/ |/ |
   ----------
  /| /| /| /|
 / |/ |/ |/ |
-------------
将其分解为自下而上的三角形条带,我们将有4条条带。4条带的三角形计数为:

1, 3, 5, 7
2*i+1
用于带
i
,带
i
0
n-1


要计算细分所需的顶点,您可以通过相应两个顶点之间的线性插值来计算沿底边的点。对于图中沿对角线的边上的点也是如此。然后沿每个条带,您再次在相应两个点之间进行线性插值,即spli将条带
i
的左侧分为
i
块,将条带右侧分为
i+1
块。

我不明白问题出在哪里。是什么原因使这与四边形(长方形)不同,并且比四边形(长方形)更困难?您是否计划将三角形细分为更小的三角形?为什么您认为这对于纹理贴图是必要的?您的问题是什么?例如,如何对四边形进行纹理贴图*以及为什么相同的技术不适用于三角形?*:显示代码!我只需在xy平面中绘制矩形,然后应用必要的变换在两个维度上进行匹配,这很简单。那么,问题到底是什么?可能有很多问题。计算正确的法线,也许吧?一个说明确切问题的代码片段会很有帮助:)只是想补充一点,如果你把每一条边分成n块,你最终会得到n²的三角形(这直接来自于对
2*i+1
公式求和)。