1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
/*
Crée une sphère centrée en (x,y,z), de rayon r, de précision n
Les faces doivent être orientées CounterClockwise, n doit être pair
method est pour choisir si les patchs sont quad (0) ou tri (1)
Crée des coordonnées de texture pour une texture 2d plane
Nécessite <math.h>
*/
void createSphere(double x, double y, double z, double r,int n,int method)
{
int i,j;
double t1,t2,t3;
double e[3],p[3];
if (r < 0)
r = -r;
if (n < 0)
n = -n;
if (n < 4 || r <= 0) {
glBegin(GL_POINTS);
glVertex3f(x,y,z);
glEnd();
return;
}
for (j=0;j<n/2;j++) {
t1 = j * 2 * M_PI / n - M_PI_2;
t2 = (j + 1) * 2 * M_PI / n - M_PI_2;
if (method == 0)
glBegin(GL_QUAD_STRIP);
else
glBegin(GL_TRIANGLE_STRIP);
for (i=0;i<=n;i++) {
t3 = i * 2 * M_PI / n;
e[0] = cos(t1) * cos(t3);
e[1] = sin(t1);
e[2] = cos(t1) * sin(t3);
p[0] = x + r * e[0];
p[1] = y + r * e[1];
p[2] = z + r * e[2];
glNormal3f(e[0],e[1],e[2]);
glTexCoord2f(1-i/(double)n,2*j/(double)n);
glVertex3f(p[0],p[1],p[2]);
e[0] = cos(t2) * cos(t3);
e[1] = sin(t2);
e[2] = cos(t2) * sin(t3);
p[0] = x + r * e[0];
p[1] = y + r * e[1];
p[2] = z + r * e[2];
glNormal3f(e[0],e[1],e[2]);
glTexCoord2f(1-i/(double)n,2*(j+1)/(double)n);
glVertex3f(p[0],p[1],p[2]);
}
glEnd();
}
} |
Partager