Rotating problem

Problems with Canvas, OpenGL, etc...

Rotating problem

Postby MacGoose » Sat Oct 23, 2010 1:53 pm

Hi!

I'm trying to learn OpenGL ES. I've reached a point where I rotate an object by touching the screen. It looks nice but when I rotate the cube up or down 90+ degrees it inverts the rotating. I know why it's happening and all, and I've tried to fix it but I never get it 100%.

ModelViewer.java:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package com.test.modelviewer;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.Window;
  6. import android.view.WindowManager;
  7.  
  8. public class ModelViewer extends Activity {
  9.        
  10.         private GLControlView glControlView;
  11.  
  12.         @Override
  13.         public void onCreate( Bundle savedInstanceState ) {
  14.                 super.onCreate( savedInstanceState );
  15.                
  16.                 this.requestWindowFeature( Window.FEATURE_NO_TITLE );
  17.                 getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN );
  18.                
  19.                 glControlView = new GLControlView( this );
  20.                 setContentView( glControlView );
  21.                
  22.     }
  23.        
  24.         @Override
  25.         protected void onResume() {
  26.                 super.onResume();
  27.                
  28.                 glControlView.onResume();
  29.                
  30.         }
  31.        
  32.         @Override
  33.         protected void onPause() {
  34.                 super.onPause();
  35.                
  36.                 glControlView.onPause();
  37.                
  38.         }
  39.  
  40. }
Parsed in 0.033 seconds, using GeSHi 1.0.8.4

GLControlView.java:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package com.test.modelviewer;
  2.  
  3. import javax.microedition.khronos.egl.EGLConfig;
  4. import javax.microedition.khronos.opengles.GL10;
  5.  
  6. import android.content.Context;
  7. import android.opengl.GLSurfaceView;
  8. import android.opengl.GLU;
  9. import android.opengl.GLSurfaceView.Renderer;
  10. import android.view.MotionEvent;
  11.  
  12. public class GLControlView extends GLSurfaceView implements Renderer {
  13.        
  14.         private float xPrevious, yPrevious;
  15.         private float xRotation = 0.0f, yRotation = 0.0f;
  16.        
  17.         private SimpleCubeObject cubeObject;
  18.        
  19.         public GLControlView( Context context ) {
  20.                 super( context );
  21.                
  22.                 this.setRenderer( this );
  23.                
  24.                 this.requestFocus();
  25.                 this.setFocusableInTouchMode( true );
  26.                
  27.                 cubeObject = new SimpleCubeObject();
  28.                
  29.         }
  30.        
  31.         public void onSurfaceCreated( GL10 gl, EGLConfig config ) {
  32.                
  33.                 gl.glClearColor( 0.0f, 0.0f, 0.0f, 0.5f );
  34.                 gl.glShadeModel( GL10.GL_SMOOTH );
  35.                 gl.glClearDepthf( 1.0f );
  36.                 gl.glEnable( GL10.GL_DEPTH_TEST );
  37.                 gl.glDepthFunc( GL10.GL_LEQUAL );
  38.                 gl.glHint( GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST );
  39.                
  40.         }
  41.        
  42.         public void onDrawFrame( GL10 gl ) {
  43.                
  44.                 gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
  45.                 gl.glLoadIdentity();
  46.                 gl.glTranslatef( 0.0f, 0.0f, -10.0f );
  47.                
  48.                 gl.glPushMatrix();
  49.                
  50.                 gl.glRotatef( xRotation, 1.0f, 0.0f, 0.0f );
  51.                 gl.glRotatef( yRotation, 0.0f, 1.0f, 0.0f );
  52.                
  53.                 gl.glPushMatrix();
  54.                 cubeObject.draw( gl );
  55.                 gl.glPopMatrix();
  56.                
  57.                 gl.glPopMatrix();
  58.                
  59.         }
  60.        
  61.         public void onSurfaceChanged( GL10 gl, int width, int height ) {
  62.                
  63.                 gl.glViewport( 0, 0, width, height );
  64.                 gl.glMatrixMode( GL10.GL_PROJECTION );
  65.                 gl.glLoadIdentity();
  66.                 GLU.gluPerspective( gl, 45.0f, ( ( float )width / ( float )height ), 0.1f, 100.0f );
  67.                 gl.glMatrixMode( GL10.GL_MODELVIEW );
  68.                 gl.glLoadIdentity();
  69.                
  70.         }
  71.        
  72.         @Override
  73.         public boolean onTouchEvent( MotionEvent event ) {
  74.                
  75.                 float xEvent = event.getX();
  76.                 float yEvent = event.getY();
  77.                
  78.                 switch( event.getAction() ) {
  79.                
  80.                         case MotionEvent.ACTION_DOWN: {
  81.                                
  82.                                 xPrevious = xEvent;
  83.                                 yPrevious = yEvent;
  84.                                
  85.                                 return true;
  86.                                
  87.                         }
  88.                
  89.                         case MotionEvent.ACTION_MOVE: {
  90.                                
  91.                                 float xDelta = xEvent - xPrevious;
  92.                                 float yDelta = yEvent - yPrevious;
  93.                                
  94.                                 xRotation += ( yDelta * 0.5f );
  95.                                 yRotation += ( xDelta * 0.5f );
  96.                                
  97.                                 xPrevious = xEvent;
  98.                                 yPrevious = yEvent;
  99.                                
  100.                                 return true;
  101.                                
  102.                         }
  103.                        
  104.                         default: return super.onTouchEvent( event );
  105.                
  106.                 }
  107.                
  108.         }
  109.  
  110. }
Parsed in 0.040 seconds, using GeSHi 1.0.8.4

SimpleCubeObject.java:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package com.test.modelviewer;
  2.  
  3. import java.nio.ByteBuffer;
  4. import java.nio.ByteOrder;
  5. import java.nio.FloatBuffer;
  6. import java.nio.ShortBuffer;
  7.  
  8. import javax.microedition.khronos.opengles.GL10;
  9.  
  10. public class SimpleCubeObject {
  11.        
  12.         private float colors[] = {
  13.                        
  14.                         0.0f, 0.0f, 0.0f, 1.0f,
  15.                         1.0f, 0.0f, 0.0f, 1.0f,
  16.                         0.0f, 1.0f, 0.0f, 1.0f,
  17.                         0.0f, 0.0f, 1.0f, 1.0f,
  18.                         1.0f, 0.0f, 1.0f, 1.0f,
  19.                         0.0f, 1.0f, 1.0f, 1.0f,
  20.                         1.0f, 1.0f, 0.0f, 1.0f,
  21.                         1.0f, 1.0f, 1.0f, 1.0f
  22.                        
  23.         };
  24.        
  25.         private short indices[] = {
  26.                        
  27.                         0, 1, 2, 0, 2, 3,
  28.                         1, 5, 6, 1, 6, 2,
  29.                         2, 6, 7, 2, 7, 3,
  30.                         3, 7, 4, 3, 4, 0,
  31.                         0, 4, 5, 0, 5, 1,
  32.                         7, 6, 5, 7, 5, 4
  33.                        
  34.         };
  35.  
  36.         private float vertices[] = {
  37.                        
  38.                         -1.0f,  1.0f, -1.0f,
  39.                         -1.0f,  1.0f,  1.0f,
  40.                          1.0f,  1.0f,  1.0f,
  41.                          1.0f,  1.0f, -1.0f,
  42.                         -1.0f, -1.0f, -1.0f,
  43.                         -1.0f, -1.0f,  1.0f,
  44.                          1.0f, -1.0f,  1.0f,
  45.                          1.0f, -1.0f, -1.0f
  46.                        
  47.         };
  48.        
  49.         private FloatBuffer colorBuffer;
  50.         private ShortBuffer indexBuffer;
  51.         private FloatBuffer vertexBuffer;
  52.        
  53.         public SimpleCubeObject() {
  54.                
  55.                 ByteBuffer cbb = ByteBuffer.allocateDirect( colors.length * 4 );
  56.                 cbb.order( ByteOrder.nativeOrder() );
  57.                 colorBuffer = cbb.asFloatBuffer();
  58.                 colorBuffer.put( colors );
  59.                 colorBuffer.position( 0 );
  60.                
  61.                 ByteBuffer ibb = ByteBuffer.allocateDirect( indices.length * 2 );
  62.                 ibb.order( ByteOrder.nativeOrder() );
  63.                 indexBuffer = ibb.asShortBuffer();
  64.                 indexBuffer.put( indices );
  65.                 indexBuffer.position( 0 );
  66.                
  67.                 ByteBuffer vbb = ByteBuffer.allocateDirect( vertices.length * 4 );
  68.                 vbb.order( ByteOrder.nativeOrder() );
  69.                 vertexBuffer = vbb.asFloatBuffer();
  70.                 vertexBuffer.put( vertices );
  71.                 vertexBuffer.position( 0 );
  72.                
  73.         }
  74.        
  75.         public void draw( GL10 gl ) {
  76.                
  77.                 gl.glFrontFace( GL10.GL_CCW );
  78.                 gl.glEnable( GL10.GL_CULL_FACE );
  79.                 gl.glCullFace( GL10.GL_BACK );
  80.                
  81.                 gl.glEnableClientState( GL10.GL_COLOR_ARRAY );
  82.                 gl.glEnableClientState( GL10.GL_VERTEX_ARRAY );
  83.                
  84.                 gl.glColorPointer( 4, GL10.GL_FLOAT, 0, colorBuffer );
  85.                 gl.glVertexPointer( 3, GL10.GL_FLOAT, 0, vertexBuffer );
  86.  
  87.                 gl.glDrawElements( GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer );
  88.                
  89.                 gl.glDisableClientState( GL10.GL_VERTEX_ARRAY );
  90.                 gl.glDisableClientState( GL10.GL_COLOR_ARRAY );
  91.                
  92.                 gl.glDisable( GL10.GL_CULL_FACE );
  93.                
  94.         }
  95.        
  96. }
Parsed in 0.041 seconds, using GeSHi 1.0.8.4

What do I have to do here to make sure rotating moves as expected and doesn't get inverted? To test it out, move the cube up or down 180 degrees and then try to move it left or right.

, MacGoose
MacGoose
Freshman
Freshman
 
Posts: 5
Joined: Sun Apr 25, 2010 9:17 pm

Top

Return to Android 2D/3D Graphics - OpenGL Problems

Who is online

Users browsing this forum: No registered users and 1 guest