public void draw( Sphere shape, GL2 gl ) {
final float IA = 0.447213595f;
final float IB = 0.276393202f;
final float IC = 0.723606797f;
final float ID = 0.525731112f;
final float IE = 0.850650808f;
final float VTX[][] = {
{ 0.0f, 1.0f, 0.0f }, // 0
{ 0.0f, IA, 2.0f*IA },
{ IE, IA, IB },
{ ID, IA, -IC },
{ -ID, IA, -IC },
{ -IE, IA, IB }, // 5
{ ID, -IA, IC }, // 6
{ IE, -IA, -IB },
{ 0.0f, -IA,-2.0f*IA },
{ -IE, -IA, -IB },
{ -ID, -IA, IC }, // 10
{ 0.0f,-1.0f, 0.0f }
};
// { 0, 1, 2 }, { 0, 2, 3 }, { 0, 3, 4 }, { 0, 4, 5 }, { 0, 5, 1 }, // ファン, 上側
// {11, 6, 7 }, {11, 7, 8 }, {11, 8, 9 }, {11, 9,10 }, {11,10, 6 }, // ファン, 下側
// トライアングルファン 7頂点 * 2
final int FAN_IDX[] = {
0, 1, 2, 3, 4, 5, 1,
11, 6,10, 9, 8, 7, 6
};
// ストリップは以下のようにつながる
// 1 2 3 4 5 1
// 6 7 8 9 0 6 (0=10)
final int STRIP_IDX[] = {
1, 6, 2, 7, 3, 8, 4, 9, 5,10, 1, 6
};
final float radius = shape.radius;
Vector3f vtx[] = new Vector3f[12];
for( int i = 0; i < 12; i++ ) {
vtx[i] = new Vector3f( VTX[i][0], VTX[i][1], VTX[i][2] );
vtx[i].multiply( radius );
vtx[i].add( shape.center );
}
final int FAN_VERTEX_CNT = 7;
gl.glBegin( GL.GL_TRIANGLE_FAN );
for( int i = 0; i < FAN_VERTEX_CNT; i++ ) {
gl.glVertex3f( vtx[FAN_IDX[i]].x, vtx[FAN_IDX[i]].y, vtx[FAN_IDX[i]].z );
}
gl.glEnd();
gl.glBegin( GL.GL_TRIANGLE_FAN );
for( int i = 0; i < FAN_VERTEX_CNT; i++ ) {
gl.glVertex3f( vtx[FAN_IDX[7+i]].x, vtx[FAN_IDX[7+i]].y, vtx[FAN_IDX[7+i]].z );
}
gl.glEnd();
// ストリップで真ん中の帯を描く
final int STRIP_VERTEX_CNT = 12;
gl.glBegin( GL.GL_TRIANGLE_STRIP );
for( int i = 0; i < STRIP_VERTEX_CNT; i++ ) {
gl.glVertex3f( vtx[STRIP_IDX[i]].x, vtx[STRIP_IDX[i]].y, vtx[STRIP_IDX[i]].z );
}
gl.glEnd();
}
|