Android Opengl GLU.gluLook не работает - PullRequest
1 голос
/ 24 июля 2011

Я новичок в OpenGL и не могу понять, как использовать gluLookAt. Ниже мой источник - любая помощь будет высоко ценится.

   public void onSurfaceCreated(GL10 gl, EGLConfig config)
    {       
       gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbientBuffer);                gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuseBuffer);              gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer);   
 gl.glEnable(GL10.GL_LIGHT0);                                                   
gl.glColor4f(1.0f, 1.0f, 1.0f, 0.5f);               
      gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);       

     gl.glDisable(GL10.GL_DITHER);              
     gl.glEnable(GL10.GL_TEXTURE_2D);           
     gl.glShadeModel(GL10.GL_SMOOTH);           
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);           
     gl.glClearDepthf(1.0f);                    
     gl.glEnable(GL10.GL_DEPTH_TEST);                 
     gl.glDepthFunc(GL10.GL_LEQUAL);            


    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 


    cube.loadGLTexture(gl, this.context);
}



public void onDrawFrame(GL10 gl) {

    gl.glMatrixMode(GL10.GL_MODELVIEW);     //Select The Modelview Matrix
    gl.glLoadIdentity();                    //Reset The Modelview Matrix
    GLU.gluLookAt(gl, xrot, yrot, 0.0f, 0.0f, xrot, yrot, 0.0f, 0.0f, 0.0f);

    //Clear Screen And Depth Buffer
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
    gl.glLoadIdentity();                    //Reset The Current Modelview Matrix

    //Check if the light flag has been set to enable/disable lighting
    if(light) {
        gl.glEnable(GL10.GL_LIGHTING);
    } else {
        gl.glDisable(GL10.GL_LIGHTING);
    }

    //Check if the blend flag has been set to enable/disable blending
    if(blend) {
        gl.glEnable(GL10.GL_BLEND);         //Turn Blending On ( NEW )
        gl.glDisable(GL10.GL_DEPTH_TEST);   //Turn Depth Testing Off ( NEW )

    } else {
        gl.glDisable(GL10.GL_BLEND);        //Turn Blending On ( NEW )
        gl.glEnable(GL10.GL_DEPTH_TEST);    //Turn Depth Testing Off ( NEW )
    }

    //Drawing
    gl.glTranslatef(0.0f, 0.0f, z);         //Move z units into the screen
    gl.glScalef(0.8f, 0.8f, 0.8f);          //Scale the Cube to 80 percent, otherwise it would be too large for the screen

    //Rotate around the axis based on the rotation matrix (rotation, x, y, z)
    gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);   //X
    gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);   //Y

    cube.draw(gl, filter);                  //Draw the Cube 



    //Change rotation factors
    xrot += xspeed;
    yrot += yspeed;
}


/**
 * If the surface changes, reset the view
 */
public void onSurfaceChanged(GL10 gl, int width, int height) {
    if(height == 0) {                       //Prevent A Divide By Zero By
        height = 1;                         //Making Height Equal One
    }

    gl.glViewport(0, 0, width, height);     //Reset The Current Viewport
    gl.glMatrixMode(GL10.GL_PROJECTION);    //Select The Projection Matrix
    gl.glLoadIdentity();                    //Reset The Projection Matrix

    //Calculate The Aspect Ratio Of The Window
    GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f);

    gl.glMatrixMode(GL10.GL_MODELVIEW);     //Select The Modelview Matrix
    gl.glLoadIdentity();                    //Reset The Modelview Matrix
}

1 Ответ

2 голосов
/ 24 июля 2011

Я вижу две вещи.Во-первых, поскольку glulookat определен как gluLookAt ( eyeX , eyeY , eyeZ , centerX , centerY , centerZ , upX , upY , upZ )

Ваш вызов должен быть изменен на GLU.gluLookAt(gl, xrot, yrot, 0.0f, 0.0f, xrot, yrot, 0.0f, 1.0f, 0.0f); Обратите внимание на новый вектор повышения '0.0, 1.0, 0.0'.В основном говорит, что ось Y находится там, где вы хотите, чтобы 'up' был.

Кроме того, вы, кажется, используете значения поворота для остальной части вызова.Первый триплет должен быть положением того места, куда вы смотрите, а второй вектор должен быть исходным положением, обычно там, где находится ваш зритель.Посмотрите на http://developer.android.com/reference/android/opengl/GLU.html

Вторая проблема: если вы вызываете loadIdentity после вызова glulookat, я почти уверен, что, поскольку он загружает матрицу идентичности, вы потеряете преобразование, которое выполняет glulookat.Поэтому попробуйте добавить glulookat после того, как вы разместите свою геометрию.

Вот что я в основном говорю в коде:

public void onDrawFrame(GL10 gl) {

//cleaned up the reset code
gl.glMatrixMode(GL10.GL_MODELVIEW);     
gl.glLoadIdentity();                    
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    

//Check if the light flag has been set to enable/disable lighting
if(light) {
    gl.glEnable(GL10.GL_LIGHTING);
} else {
    gl.glDisable(GL10.GL_LIGHTING);
}

//Check if the blend flag has been set to enable/disable blending
if(blend) {
    gl.glEnable(GL10.GL_BLEND);         //Turn Blending On ( NEW )
    gl.glDisable(GL10.GL_DEPTH_TEST);   //Turn Depth Testing Off ( NEW )

} else {
    gl.glDisable(GL10.GL_BLEND);        //Turn Blending On ( NEW )
    gl.glEnable(GL10.GL_DEPTH_TEST);    //Turn Depth Testing Off ( NEW )
}

//Drawing
gl.glTranslatef(0.0f, 0.0f, z);         //Move z units into the screen
gl.glScalef(0.8f, 0.8f, 0.8f);          //Scale the Cube to 80 percent, otherwise it would be too large for the screen

//Rotate around the axis based on the rotation matrix (rotation, x, y, z)
gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);   //X
gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);   //Y

//change the perspective matrix to look at the rotating cube (0,0,z), from (0,0,0)
//with (0,1,0) as the up vector
GLU.gluLookAt(gl, 0.0f, 0.0, z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
cube.draw(gl, filter);                  //Draw the Cube 



//Change rotation factors
xrot += xspeed;
yrot += yspeed;


 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...