gpt4 book ai didi

c - 如何在三个维度上 segmentation 三角形?

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:07 27 4
gpt4 key购买 nike

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

但由于我想在避免透视变形的同时对这个三角形进行纹理贴图,我必须对其进行 segmentation ,并使用顶点进行纹理贴图和法线计算。

我设法为矩形、球体、圆柱体和圆环体做了这个,但我一辈子都想不出如何做三角形。

我设法找到的每个三角形映射示例都仅适用于 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();
}

我明白了。这很简单,因为它在二维空间中。我的目标是相同类型的逻辑,但目标是 3D 空间三角形。

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

例如:

P1->(0,0,1); P2->(1,0,0); P3->(0,1,0);

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

编辑:

如下所示,改写问题的方法可能是:“如何在三个维度上 segmentation 一般三角形”?

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

最佳答案

正如评论中所建议的那样,您可以切出一个与四边形非常相似的三角形。一些花哨的 ASCII 艺术:

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

将其分解为从下到上的三角形 strip ,我们将有 4 个 strip 。 4 strip 的三角形计数为:

1, 3, 5, 7

2 * i + 1 用于 strip ii0n - 1

要计算 segmentation 所需的顶点,可以通过对应的两个顶点之间的线性插值来计算沿底边的点。对于图中沿对角线的边缘的点也是如此。然后沿着每个 strip ,再次在相应的两个点之间进行线性插值,将 strip i 的左侧拆分为 i block ,将右侧拆分为 i + 1 件。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com