Hello there! I was trying to create a 3D rotateable sphere but with a circle attached on its surface. While I managed to accomplish creating a simple sphere with Java OpenGL and rotate it with keyboard input and creating a flat red circle, I have absolutely no clue on combining the two of them together.

So far I get the idea to create another smaller sphere but with different color and overlap it with the bigger, white sphere. But how exactly I should do this?

Here's what I managed to do so far. If someone can point me in the right direction, I would really appreciate it.

Code :
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.GLJPanel;
import javax.swing.JFrame;
 
 
public class Sphere extends GLJPanel implements GLEventListener,KeyListener {
 
    /**
     * 
     */
 
 
	private float rotateX, rotateY, rotateZ;
 
	public static void main(String[] args) {
        JFrame window = new JFrame("Sphere Test");
        GLCapabilities caps = new GLCapabilities(null);
        Sphere panel = new Sphere(caps);
        window.setContentPane(panel);
        window.pack();
        window.setLocation(50, 50);
        window.setResizable(false);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        panel.requestFocusInWindow();
 
    public Sphere(GLCapabilities capabilities) {
        // TODO Auto-generated constructor stub
        setPreferredSize(new Dimension(400, 400));
        addGLEventListener(this);
        addKeyListener(this);
        rotateX = 15;
        rotateY = 15;
        rotateZ = 0;
    }
 
    void drawSphere(double r, int lats, int longs,GL2 gl) {
                int i, j;
                for(i = 0; i <= lats; i++) {
                    double lat0 = Math.PI * (-0.5 + (double) (i - 1) / lats);
                   double z0  = Math.sin(lat0);
                   double zr0 =  Math.cos(lat0);
 
                   double lat1 = Math.PI * (-0.5 + (double) i / lats);
                   double z1 = Math.sin(lat1);
                   double zr1 = Math.cos(lat1);
 
                   gl.glBegin(gl.GL_QUAD_STRIP);
                   for(j = 0; j <= longs; j++) {
                       double lng = 2 * Math.PI * (double) (j - 1) / longs;
                       double x = Math.cos(lng);
                       double y = Math.sin(lng);
 
                       gl.glNormal3d(x * zr0, y * zr0, z0);
                       gl.glVertex3d(x * zr0, y * zr0, z0);
                       gl.glNormal3d(x * zr1, y * zr1, z1);
                       gl.glVertex3d(x * zr1, y * zr1, z1);
                   }
                   gl.glEnd();
               }
           }
 
    void drawSphere2(double r, int lats, int longs,GL2 gl) {
        int i, j;
        for(i = 0; i <= lats; i++) {
            double lat0 = Math.PI * (-0.5 + (double) (i - 1) / lats);
           double z0  = Math.sin(lat0);
           double zr0 =  Math.cos(lat0);
 
           double lat1 = Math.PI * (-0.5 + (double) i / lats);
           double z1 = Math.sin(lat1);
           double zr1 = Math.cos(lat1);
 
           gl.glBegin(gl.GL_QUAD_STRIP);
           for(j = 0; j <= longs; j++) {
               double lng = 2 * Math.PI * (double) (j - 1) / longs;
               double x = Math.cos(lng);
               double y = Math.sin(lng);
 
               gl.glNormal3d(x * zr0 , y * zr0 , z0 );
               gl.glVertex3d(x * zr0 , y * zr0 , z0 );
               gl.glNormal3d(x * zr1 , y * zr1 , z1 );
               gl.glVertex3d(x * zr1 , y * zr1 , z1 );
           }
           gl.glEnd();
       }
   }
 
           void computeLocation(GL2 gl) {
               double x = 2 * Math.cos(0);     // my x-, y-, and z-coordinates
               double y = 2 * Math.sin(0);
               double z = 20;
               double d = Math.sqrt(x * x + y * y + z * z); // distance to origin
 
               gl.glMatrixMode(gl.GL_PROJECTION);        // Set projection parameters.
               gl.glLoadIdentity();
               gl.glFrustum(-d * 0.5, d * 0.5, -d * 0.5, d * 0.5, d - 1.1, d + 1.1);
          }
 
 
           public void display(GLAutoDrawable drawable) {
                GL2 gl = drawable.getGL().getGL2();
 
                gl.glClearColor(0, 0, 0, 0);
                gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
 
                gl.glMatrixMode(GL2.GL_PROJECTION);
                gl.glLoadIdentity();
                gl.glMatrixMode(GL2.GL_MODELVIEW);
                gl.glLoadIdentity();
 
                gl.glRotatef(rotateZ, 0, 0, 1);
                gl.glRotatef(rotateY, 0, 1, 0);
                gl.glRotatef(rotateX, 1, 0, 0);
 
 
               gl.glColor3d(1.0, 1.0, 1.0);
                drawSphere(1, 30, 30, gl);
 
                gl.glColor3d(1.0, 0, 0);
                drawSphere2(1, 30, 30, gl);
 
           }
 
            public void init(GLAutoDrawable drawable) {
                // called when the panel is created
                GL2 gl = drawable.getGL().getGL2();
         //       computeLocation(gl);
                gl.glEnable(GL.GL_DEPTH_TEST);
            }
 
            @Override
            public void dispose(GLAutoDrawable drawable) {
 
            }
 
            @Override
            public void reshape(GLAutoDrawable drawable, int x, int y, int width,
                    int height) {
 
            }
 
            @Override
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();
                if (key == KeyEvent.VK_LEFT)
                    rotateY -= 15;
                else if (key == KeyEvent.VK_RIGHT)
                    rotateY += 15;
                else if (key == KeyEvent.VK_DOWN)
                    rotateX += 15;
                else if (key == KeyEvent.VK_UP)
                    rotateX -= 15;
                else if (key == KeyEvent.VK_PAGE_UP)
                    rotateZ += 15;
                else if (key == KeyEvent.VK_PAGE_DOWN)
                    rotateZ -= 15;
                else if (key == KeyEvent.VK_HOME)
                    rotateX = rotateY = rotateZ = 0;
                repaint();
            }
 
            @Override
            public void keyReleased(java.awt.event.KeyEvent e) {
                // TODO Auto-generated method stub
            }
 
            @Override
            public void keyTyped(java.awt.event.KeyEvent e) {
                // TODO Auto-generated method stub
            }
}