簡體   English   中英

在openGL android中旋轉三角形

[英]Rotate triangle in openGL android

我根據developer.android.com的入門示例制作了一個簡單的應用程序。 它工作正常,但我更改了旋轉邏輯,現在不顯示三角形。 我不確定我是否了解矩陣內容,所以我想知道是否有人可以檢查我的代碼。 我認為這是SurfaceView方法可能有問題:

@Override
public boolean onTouchEvent(MotionEvent e){
    float x = e.getX();
    float y = e.getY();

    switch(e.getAction()){
    case MotionEvent.ACTION_MOVE:
        float rotateX = 0.0f;
        float rotateY = 0.0f;
        float rotateZ = 0.0f;

        //na coluna da esquerda, rotação no eixo Z
        if(x < getWidth() / 3){
            rotateZ = (y - previousY);
        }
        //na coluna do meio, rotação no eixo X
        if(getWidth()/3 < x && x < 2*getWidth()/3){
            rotateX = (y - previousY);
        }
        //na coluna da direita, rotação no eixo Z invertido
        if(x > getWidth() / 3){
            rotateZ = - (y - previousY);
        }

        //na linha superior, rotação no eixo Z
        if(y < getHeight() / 3){
            rotateZ = (x - previousX);
        }
        //na linha do meio, rotação no eixo Y
        if(getHeight()/3 < y && y < 2*getHeight()/3){
            rotateY = (x - previousY);
        }
        //na linha inferior, rotação no eixo Z invertido
        if(y > 2*getHeight() / 3){
            rotateZ = - (x - previousX);
        }

        mRenderer.setAngulo(mRenderer.getAnguloX() + (rotateX) * TOUCH_SCALE_FACTOR,
                            mRenderer.getAnguloY() + (rotateY) * TOUCH_SCALE_FACTOR,
                            mRenderer.getAnguloZ() + (rotateZ) * TOUCH_SCALE_FACTOR);
        requestRender();

    }
    previousX = x;
    previousY = y;
    return true;
}

這是渲染器方法:

@Override
public void onDrawFrame(GL10 unused) {

    //desenha o fundo
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    //define a posição da camera
    //Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

    //cria uma matrix para a rotação de cada angulo
    Matrix.setRotateM(xRotationMatrix, 0, anguloX, 1, 0, 0);
    Matrix.setRotateM(yRotationMatrix, 0, anguloY, 0, 1, 0);
    Matrix.setRotateM(zRotationMatrix, 0, anguloZ, 0, 0, 1);

    float[] mMatrix = new float[16];
    //aplica todas as rotações na matrix scratch
    Matrix.multiplyMM(mMatrix, 0, xRotationMatrix, 0, mMatrix, 0);
    Matrix.multiplyMM(mMatrix, 0, yRotationMatrix, 0, mMatrix, 0);
    Matrix.multiplyMM(mMatrix, 0, zRotationMatrix, 0, mMatrix, 0);

    // Calcula a view e depois a projeção
    Matrix.multiplyMM(resultingMatrix, 0, mViewMatrix, 0, mMatrix, 0);
    Matrix.multiplyMM(resultingMatrix, 0, mProjectionMatrix, 0, resultingMatrix, 0);

    // Draw shape
    triangulo.draw(resultingMatrix);
}

Triangulo類必須正確,因為自從上次應用程序運行以來我沒有對其進行更改。

好吧,我徹底分析了您的代碼,似乎沒有任何問題。

但是,我想問題是這樣的:

你打電話時

Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

您將相機設置為Z = -5,並朝原點方向,即+ VE Z方向。

(我想最初三角形的頂點必須在XY平面中,因此三角形可見)。

那你打電話的時候

Matrix.setRotateM(zRotationMatrix, 0, anguloZ, 0, 0, 1);

它將三角形繞Z軸旋轉很好。

但是你打電話

Matrix.setRotateM(xRotationMatrix, 0, anguloX, 1, 0, 0);
Matrix.setRotateM(yRotationMatrix, 0, anguloY, 0, 1, 0);

在這里,您圍繞X和Y軸旋轉三角形,由於三角形沒有厚度,因此它不可見。

可能的修復:

1)取消繞X和Y軸的旋轉,並檢查其是否有效。

                  OR

2)放置一個立方體而不是三角形,然后看是否可行。

                  OR

3)如果都不行,請給我完整的代碼,我將調試並運行它。

祝你好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM