0

私はOpenGLを学び始めており、次のサイトを使用しています:http: //www.learnopengles.com/android-lesson-one-getting-started/

しかし、私はこの部分で問題が発生したようです(ポートレートモードでは正常に動作します):

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);     
}

しかし、横向きモードで三角形を(左または右に)移動しようとすると、三角形をいずれかの辺に移動すると、三角形が「切り取られ」ます(三角形全体が表示されません)。実際には画面の外にいるのに、画面の外にいるかのように振る舞われているようです。前述のように、ポートレートモードでは正常に機能するようです。

横向きモード(Galaxy Tab 2)では、高さは752、幅は1280です。

これは、ここで設定されているプロジェクトマトリックスと関係がありますか?

助けてくれてありがとう!

4

1 に答える 1

0

あなたは正しかった、問題はあなたがカメラを動かしていたことだった:D

xax は 0.0f のままにしておくべきでした

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

于 2013-01-06T15:20:34.130 に答える