我有一个需要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轴旋转的角度,但这真的是最好的方法吗?
编辑:
如下所述,重新解释问题的方法可能是: “我如何细分三维的一般三角形”?
由于目标是获得一个在三维空间中构建三角形(三角形条带或四边形条带)三角形的算法,因此我可以使用顶点进行纹理映射和正常计算。
答案 0 :(得分:1)
正如评论中所建议的那样,你可以切出一个非常类似于四边形的三角形。有一些奇特的ASCII艺术:
/|
/ |
----
/| /|
/ |/ |
-------
/| /| /|
/ |/ |/ |
----------
/| /| /| /|
/ |/ |/ |/ |
-------------
将其分解成从下到上的三角形条带,我们将有4个条带。 4条带的三角形数量为:
1, 3, 5, 7
条带2 * i + 1
的或i
,i
到0
的{{1}}。
要计算细分所需的顶点,可以通过相应的两个顶点之间的线性插值计算底边的点。对于沿图中对角线的边缘点的点也是如此。然后沿着每个条带,再次在相应的两个点之间进行线性插值,将条带n - 1
的左侧分成i
个片段,将右侧分成i
个片段。