我有一个函数需要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
,带i
从0
到n - 1
。要计算细分所需的顶点,可以通过相应两个顶点之间的线性插值计算沿底边的点。图中沿对角线的边上的点也是这样。然后沿着每个条带,在对应的两点之间再次进行线性插值,将条带
i
的左侧分割为i
条带,将右侧分割为i + 1
条带。关于c - 如何将三角形 segmentation 为三个维度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26259893/