我正在尝试使用cyclinders绘制一个Spherical Cap。我从我的Display函数调用该函数。(显示函数是我的glutDisplayFunc)似乎drawSphericalCap()内的循环不能正常工作。当i = 0时,它只循环一次。我想也许我不能在显示功能之外循环。所以我在显示功能中复制了相同的代码。它也不起作用。
void drawSphericalCap(float shpereRadius, float maxRadius)
{
float r = shpereRadius;
float a = maxRadius;
float h = r - sqrt((r * r) - (a * a));
//teta + 2 * beta = 180
float teta = asin(a / r);
float tanBeta = tan((180 - teta) / 2);
float numberOfCylinders = a * 10;
float heightOfEachCylinder = h / (10 * a);
glColor3f(1.0, 1.0, 1.0);
int i = 0;
for (i ; i < numberOfCylinders ; i++){
cout << i;
float translateOfEachCylinder = r - h + (heightOfEachCylinder * i);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glTranslatef(0, translateOfEachCylinder, 0);
glRotatef(90,1.0,0,0);
glutWireCylinder(a, heightOfEachCylinder, 50, 50);
glPopMatrix();
h = h - heightOfEachCylinder;
a = h * tanBeta;
}
}
显示功能中的:
glPushMatrix();
drawSphericalCap(5,3);
glPopMatrix();
我找不到球形帽的代码,所以我查看了公式,我认为上面的代码可以完成这项工作..当我发现问题时...
答案 0 :(得分:1)
感谢您的提示.. tan函数取弧度而不是度。 并且循环的问题与tan函数有关。(它返回负数,因此循环在第一次迭代后结束)。 我试过gluCyclinder()而不是glutWireCyclinder(),因为我可以安排圆柱形的顶部和底部半径。 所以我想出了一个几乎让我满意的代码,但有些东西需要纠正。但我不会让自己忙于它。所以最终的SphericalCap()函数是这样的(CAPMULTIPLIER可以更改以获得更好的质量):
#define PI 3.14159265
#define CAPMULTIPLIER 10
void drawSphericalCap(float shpereRadius, float maxRadius)
{
float r = shpereRadius;
float a = maxRadius;
float h = r - sqrt((r * r) - (a * a));
//teta + 2 * beta = 180
float teta = asin(a / r);
float tanBeta = tan((PI - teta) / 2);
float numberOfCylinders = a * CAPMULTIPLIER;
float heightOfEachCylinder = h / (10 * a);
glColor3f(1.0, 1.0, 1.0);
int i = 0;
GLUquadricObj *cyclinder;
cyclinder = gluNewQuadric();
for (i; i < numberOfCylinders; i++){
//cout << "i="<<i<< " height="<<heightOfEachCylinder<<endl;
float translateOfEachCylinder = r - h;
float smallRadius = tanBeta * (h - heightOfEachCylinder) ;
glPushMatrix();
glTranslatef(0, translateOfEachCylinder, 0);
glRotatef(-90, 1.0, 0, 0);
gluCylinder(cyclinder, a, smallRadius, heightOfEachCylinder , 50,5);
glPopMatrix();
h = h - heightOfEachCylinder;
a = smallRadius;
teta = asin(a / r);
tanBeta = tan((PI - teta) / 2);
}
}