Question

I'm starting to learn OpenGL, and are using the following site: http://www.learnopengles.com/android-lesson-one-getting-started/

But it seems that I got a problem at this part (works fine in portrait mode):

private float[] mViewMatrix = new float[16];

/** Store the projection matrix. This is used to project the scene onto a 2D viewport. */
private float[] mProjectionMatrix = new float[16];

/** Allocate storage for the final combined matrix. This will be passed into the shader program. */
private float[] mMVPMatrix = new float[16];

/** This will be used to pass in the transformation matrix. */
private int mMVPMatrixHandle;

/** This will be used to pass in model position information. */
private int mPositionHandle;

/** This will be used to pass in model color information. */
private int mColorHandle;

/** How many bytes per float. */
private final int mBytesPerFloat = 4;

/** How many elements per vertex. */
private final int mStrideBytes = 7 * mBytesPerFloat;    

/** Size of the position data in elements. */
private final int mPositionDataSize = 3;

/** Offset of the color data. */
private final int mColorOffset = 3;

/** Size of the color data in elements. */
private final int mColorDataSize = 4;

public void onSurfaceChanged(GL10 gl, int width, int height)
{       
    GLES20.glViewport(0, 0, width, height);

    // Create a new perspective projection matrix. The height will stay the same
    // while the width will vary as per aspect ratio.
    final float ratio = (float) width / height;
    final float left = -ratio;
    final float right = ratio;
    final float bottom = -1.0f;
    final float top = 1.0f;
    final float near = 1.0f;
    final float far = 10.0f;

    System.out.println("Height: " + height);
    System.out.println("Width: " + width);

    Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
}

public void onDrawFrame(GL10 gl)
{
        final float eyeX = 0.0f; 
        final float eyeY = 0.0f;
        final float eyeZ = 1.5f;

        final float lookY = 0.0f; //Y direction of what user see
        final float lookZ = -5.0f;  //Z direction of what user see

        // Set our up vector. This is where our head would be pointing were we holding the camera.
        final float upX = 0.0f;
        final float upY = 1.0f;
        final float upZ = 0.0f;

        GLES20.glClearColor(red, green, blue, clearcoloralpha);
        GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);    
        Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, xax, lookY, lookZ, upX, upY, upZ);

        // Draw the triangle facing straight on.        
        for(int i = 0; i < Triangles.size(); i++)
        {
            Matrix.setIdentityM(Triangles.get(i).getModelMatrix(), 0);

            if(Triangles.get(i).Rotate())
            {
                Triangles.get(i).rotation = (360.0f / 10000.0f) * ((int) Triangles.get(i).last);
                Triangles.get(i).last+=20;

                //Rotates the matrix by rotation degrees
                Matrix.rotateM(Triangles.get(i).getModelMatrix(), 0, Triangles.get(i).rotation, 0.0f, 0.0f, 1.0f);
            }
            else
                Matrix.rotateM(Triangles.get(i).getModelMatrix(), 0, Triangles.get(i).rotation, 0.0f, 0.0f, 1.0f);

            drawTriangle(Triangles.get(i).getFloatBuffer(),Triangles.get(i));
        }
}

private void drawTriangle(final FloatBuffer aTriangleBuffer, Triangle tri)
{       
    aTriangleBuffer.position(0);
    GLES20.glVertexAttribPointer(mPositionHandle, tri.DataSize, GLES20.GL_FLOAT, false, mStrideBytes, aTriangleBuffer);                
    GLES20.glEnableVertexAttribArray(mPositionHandle);        

    aTriangleBuffer.position(3);
    GLES20.glVertexAttribPointer(mColorHandle, tri.ColorDataSize, GLES20.GL_FLOAT, false, mStrideBytes, aTriangleBuffer);                
    GLES20.glEnableVertexAttribArray(mColorHandle);

    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, tri.getModelMatrix(), 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);     
}

But when I try to move a triangle (to the left or right) in landscape mode the triangles get "cut off" (does not display the whole triangle) when moving them to far to one of the sides. It seems that they are been acted on as if they were outside the screen when they actually are not. As mentioned it seems to work fine in portrait mode.

Height is 752 and Width 1280 in landscape mode (Galaxy Tab 2).

Does this have something to do with the Project Matrix which is set here?

Thanks for any help!

Was it helpful?

Solution

You were right, the problem was you were moving you camera :D

xax should have stayed as 0.0f

Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, xax, lookY, lookZ, upX, upY, upZ);

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top