GLUT GL 3/4 球体有问题
GLUT GL 3/4 sphere something wrong
我的图形课有任务要做。我必须只使用 GL_TRIANGLE_STRIP 构建 3/4。我已经完成了,但是有一个我不能接受的主要错误。
GLfloat radius = 3, alpha, beta, PI = 3.14314159;
//lHorizontal and lVertical im changing using keyboard it says how many
sphere divisions are
for (alpha = 0.0; alpha < PI; alpha += PI / lVertical)
{
glBegin(GL_TRIANGLE_STRIP);
for (beta = 0.0; beta < 1.5075*PI; beta += PI / lHorizontal)
{
glColor3f(1, 1, 0);
x = radius * cos(beta)*sin(alpha);
y = radius * sin(beta)*sin(alpha);
z = radius * cos(alpha);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glColor3f(0, 1, 1);
x = radius * cos(beta)*sin(alpha + PI / lVertical);
y = radius * sin(beta)*sin(alpha + PI / lVertical);
z = radius * cos(alpha + PI / lVertical);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
}
glEnd();
}
glColor3f(1, 1, 0);
glBegin(GL_TRIANGLE_STRIP);
for (alpha = PI; alpha < 2.01*PI; alpha += PI / lVertical) {
x = -radius * sin(alpha);
y = 0;
z = radius * cos(alpha);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glNormal3f(0, 0, 0);
glVertex3f(0, 0, 0);
}
glEnd();
glBegin(GL_TRIANGLE_STRIP);
for (alpha = PI; alpha < 2.01*PI; alpha += PI / lVertical) {
x = 0;
y = radius * sin(alpha);
z = -radius * cos(alpha);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glNormal3f(0, 0, 0);
glVertex3f(0, 0, 0);
}
glEnd();
这段代码的结果是:
当我改变 lHorizontal 时,出现了不应该出现的部分(看图片)。我可以更改代码以避免此问题吗?
PI的值错误:
..., PI = 3.14314159; // 3.14159... ?
改正后,让我们在外循环中测试 alpha
的值,对于 lVertical = 8
:
int lVertical = 8;
GLfloat radius = 3, alpha, beta, PI = 3.141592654;
for (alpha = 0.0; alpha < PI; alpha += PI / lVertical)
{
printf("%f, %f\n", alpha, alpha + PI / lVertical);
}
输出:
0.000000, 0.392699
0.392699, 0.785398
0.785398, 1.178097
1.178097, 1.570796
1.570796, 1.963495
1.963495, 2.356194
2.356194, 2.748893
2.748893, 3.141593
3.141593, 3.534292 <<
3.534292
大于 PI
,这意味着它是 alpha
的无效值。效果是最后一个多边形环"folds"周围,产生了不应该出现的部分。
最好直接从整数索引计算角度:
for (int i = 0; int i < lVertical; i++)
{
GLfloat alpha1 = (PI / lVertical) * i;
GLfloat alpha2 = (PI / lVertical) * (i + 1);
glBegin(GL_TRIANGLE_STRIP);
for (int j = 0; j < lHorizontal; j++)
{
GLfloat beta1 = (PI / lHorizontal) * j;
GLfloat beta2 = (PI / lHorizontal) * (j + 1);
glColor3f(1, 1, 0);
x = radius * cos(beta1)*sin(alpha1);
y = radius * sin(beta1)*sin(alpha1);
z = radius * cos(alpha1);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glColor3f(0, 1, 1);
x = radius * cos(beta2)*sin(alpha2);
y = radius * sin(beta2)*sin(alpha2);
z = radius * cos(alpha2);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
}
glEnd();
}
我的图形课有任务要做。我必须只使用 GL_TRIANGLE_STRIP 构建 3/4。我已经完成了,但是有一个我不能接受的主要错误。
GLfloat radius = 3, alpha, beta, PI = 3.14314159;
//lHorizontal and lVertical im changing using keyboard it says how many
sphere divisions are
for (alpha = 0.0; alpha < PI; alpha += PI / lVertical)
{
glBegin(GL_TRIANGLE_STRIP);
for (beta = 0.0; beta < 1.5075*PI; beta += PI / lHorizontal)
{
glColor3f(1, 1, 0);
x = radius * cos(beta)*sin(alpha);
y = radius * sin(beta)*sin(alpha);
z = radius * cos(alpha);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glColor3f(0, 1, 1);
x = radius * cos(beta)*sin(alpha + PI / lVertical);
y = radius * sin(beta)*sin(alpha + PI / lVertical);
z = radius * cos(alpha + PI / lVertical);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
}
glEnd();
}
glColor3f(1, 1, 0);
glBegin(GL_TRIANGLE_STRIP);
for (alpha = PI; alpha < 2.01*PI; alpha += PI / lVertical) {
x = -radius * sin(alpha);
y = 0;
z = radius * cos(alpha);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glNormal3f(0, 0, 0);
glVertex3f(0, 0, 0);
}
glEnd();
glBegin(GL_TRIANGLE_STRIP);
for (alpha = PI; alpha < 2.01*PI; alpha += PI / lVertical) {
x = 0;
y = radius * sin(alpha);
z = -radius * cos(alpha);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glNormal3f(0, 0, 0);
glVertex3f(0, 0, 0);
}
glEnd();
这段代码的结果是:
当我改变 lHorizontal 时,出现了不应该出现的部分(看图片)。我可以更改代码以避免此问题吗?
PI的值错误:
..., PI = 3.14314159; // 3.14159... ?
改正后,让我们在外循环中测试 alpha
的值,对于 lVertical = 8
:
int lVertical = 8;
GLfloat radius = 3, alpha, beta, PI = 3.141592654;
for (alpha = 0.0; alpha < PI; alpha += PI / lVertical)
{
printf("%f, %f\n", alpha, alpha + PI / lVertical);
}
输出:
0.000000, 0.392699
0.392699, 0.785398
0.785398, 1.178097
1.178097, 1.570796
1.570796, 1.963495
1.963495, 2.356194
2.356194, 2.748893
2.748893, 3.141593
3.141593, 3.534292 <<
3.534292
大于 PI
,这意味着它是 alpha
的无效值。效果是最后一个多边形环"folds"周围,产生了不应该出现的部分。
最好直接从整数索引计算角度:
for (int i = 0; int i < lVertical; i++)
{
GLfloat alpha1 = (PI / lVertical) * i;
GLfloat alpha2 = (PI / lVertical) * (i + 1);
glBegin(GL_TRIANGLE_STRIP);
for (int j = 0; j < lHorizontal; j++)
{
GLfloat beta1 = (PI / lHorizontal) * j;
GLfloat beta2 = (PI / lHorizontal) * (j + 1);
glColor3f(1, 1, 0);
x = radius * cos(beta1)*sin(alpha1);
y = radius * sin(beta1)*sin(alpha1);
z = radius * cos(alpha1);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glColor3f(0, 1, 1);
x = radius * cos(beta2)*sin(alpha2);
y = radius * sin(beta2)*sin(alpha2);
z = radius * cos(alpha2);
glNormal3f(x, y, z);
glVertex3f(x, y, z);
}
glEnd();
}