Android 나 iOS 에서는 openGL ES 를 사용한다. openGL ES 에서는 사각형을 지원하지 않기 때문에 glut 에서 사용하는 것과 같은 GL_QUADS 따위의 도형은 그릴 수 없다. 때문에 GL_ANGLES 등을 이용한 구를 그려야 하는데, 간단하게 freeglut 에 있는 것을 가져오기로 하였다.
freeglut 전체를 사용하겠다면 모르겠지만, 일부만 사용하기 때문에 관련된 함수만 같이 가져왔다. 아래는 구를 그리기 위한 소스이다. 소스의 출처는 이곳.
이외에도 구를 그리는 다양한 방법들이 있다. 관련된 링크를 아래 첨부한다.
http://paulbourke.net/miscellaneous/sphere_cylinder/
http://marc.blog.atpurpose.com/2009/10/31/creating-sphere-from-a-rectangular-mesh/
http://ozark.hendrix.edu/~burch/cs/490/sched/feb8/
freeglut 전체를 사용하겠다면 모르겠지만, 일부만 사용하기 때문에 관련된 함수만 같이 가져왔다. 아래는 구를 그리기 위한 소스이다. 소스의 출처는 이곳.
static void fghCircleTable(double **sint,double **cost,const int n)
{
int i;
/* Table size, the sign of n flips the circle direction */
const int size = abs(n);
/* Determine the angle between samples */
const double angle = 2*M_PI/(double)( ( n == 0 ) ? 1 : n );
/* Allocate memory for n samples, plus duplicate of first entry at the end */
*sint = (double *) calloc(sizeof(double), size+1);
*cost = (double *) calloc(sizeof(double), size+1);
/* Bail out if memory allocation fails, fgError never returns */
if (!(*sint) || !(*cost))
{
free(*sint);
free(*cost);
}
/* Compute cos and sin around the circle */
(*sint)[0] = 0.0;
(*cost)[0] = 1.0;
for (i=1; i<size; i++)
{
(*sint)[i] = sin(angle*i);
(*cost)[i] = cos(angle*i);
}
/* Last sample is duplicate of the first */
(*sint)[size] = (*sint)[0];
(*cost)[size] = (*cost)[0];
}
void solidSphere(GLdouble radius, GLint slices, GLint stacks)
{
int i,j;
/* Adjust z and radius as stacks are drawn. */
double z0,z1;
double r0,r1;
/* Pre-computed circle */
double *sint1,*cost1;
double *sint2,*cost2;
fghCircleTable(&sint1,&cost1,-slices);
fghCircleTable(&sint2,&cost2,stacks*2);
/* The top stack is covered with a triangle fan */
z0 = 1.0;
z1 = cost2[(stacks>0)?1:0];
r0 = 0.0;
r1 = sint2[(stacks>0)?1:0];
glBegin(GL_TRIANGLE_FAN);
glNormal3d(0,0,1);
glVertex3d(0,0,radius);
for (j=slices; j>=0; j--)
{
glNormal3d(cost1[j]*r1, sint1[j]*r1, z1 );
glVertex3d(cost1[j]*r1*radius, sint1[j]*r1*radius, z1*radius);
}
glEnd();
/* Cover each stack with a quad strip, except the top and bottom stacks */
for( i=1; i<stacks-1; i++ )
{
z0 = z1; z1 = cost2[i+1];
r0 = r1; r1 = sint2[i+1];
glBegin(GL_QUAD_STRIP);
for(j=0; j<=slices; j++)
{
glNormal3d(cost1[j]*r1, sint1[j]*r1, z1 );
glVertex3d(cost1[j]*r1*radius, sint1[j]*r1*radius, z1*radius);
glNormal3d(cost1[j]*r0, sint1[j]*r0, z0 );
glVertex3d(cost1[j]*r0*radius, sint1[j]*r0*radius, z0*radius);
}
glEnd();
}
/* The bottom stack is covered with a triangle fan */
z0 = z1;
r0 = r1;
glBegin(GL_TRIANGLE_FAN);
glNormal3d(0,0,-1);
glVertex3d(0,0,-radius);
for (j=0; j<=slices; j++)
{
glNormal3d(cost1[j]*r0, sint1[j]*r0, z0 );
glVertex3d(cost1[j]*r0*radius, sint1[j]*r0*radius, z0*radius);
}
glEnd();
/* Release sin and cos tables */
free(sint1);
free(cost1);
free(sint2);
free(cost2);
}
void wireSphere(GLdouble radius, GLint slices, GLint stacks)
{
int i,j;
/* Adjust z and radius as stacks and slices are drawn. */
double r;
double x,y,z;
/* Pre-computed circle */
double *sint1,*cost1;
double *sint2,*cost2;
fghCircleTable(&sint1,&cost1,-slices );
fghCircleTable(&sint2,&cost2, stacks*2);
/* Draw a line loop for each stack */
for (i=1; i<stacks; i++)
{
z = cost2[i];
r = sint2[i];
glBegin(GL_LINE_LOOP);
for(j=0; j<=slices; j++)
{
x = cost1[j];
y = sint1[j];
glNormal3d(x,y,z);
glVertex3d(x*r*radius,y*r*radius,z*radius);
}
glEnd();
}
/* Draw a line loop for each slice */
for (i=0; i<slices; i++)
{
glBegin(GL_LINE_STRIP);
for(j=0; j<=stacks; j++)
{
x = cost1[i]*sint2[j];
y = sint1[i]*sint2[j];
z = cost2[j];
glNormal3d(x,y,z);
glVertex3d(x*radius,y*radius,z*radius);
}
glEnd();
}
/* Release sin and cos tables */
free(sint1);
free(cost1);
free(sint2);
free(cost2);
}
이외에도 구를 그리는 다양한 방법들이 있다. 관련된 링크를 아래 첨부한다.
http://paulbourke.net/miscellaneous/sphere_cylinder/
http://marc.blog.atpurpose.com/2009/10/31/creating-sphere-from-a-rectangular-mesh/
http://ozark.hendrix.edu/~burch/cs/490/sched/feb8/
'openGL' 카테고리의 다른 글
| openGL ES 에서 구 그리기 (0) | 2011/07/20 |
|---|---|
| 깃발 휘날리기 (0) | 2011/07/18 |
| Frustum 설정 방법 (0) | 2011/07/18 |
