2013-04-05 10 views
5

Modifica - Aggiunto più codiceUtilizzo di Matrix. Ruotare in OpenGL ES 2.0

Avere un sacco di problemi che tentano di ruotare correttamente il mio quad utilizzando OpenGL ES 2.0.

Sembra sempre ruotare attorno al centro delle coordinate dello schermo. Sto cercando di farlo ruotare attorno al suo centro (per 2d, quindi solo per l'asse z).

Ho sperimentato Matrix.translate come mostrato di seguito. Tuttavia, cambiando la posizione x o y qui semplicemente si disegna il quad in una posizione diversa sullo schermo, ma quando ruota, di nuovo ruota intorno al centro dello schermo. Per favore qualcuno potrebbe spiegare come farlo ruotare attorno al proprio asse z (come una ruota)?

Grazie, ecco le righe di codice pertinenti: se ne è necessario altro, si prega di chiedere e posterò. (Si noti che ho esaminato molte domande simili su SO e su Internet in generale, ma non sono riuscito a trovare una risposta fino ad ora).

Grazie.

//Set rotation 
Matrix.setRotateM(mRotationMatrix, 0, -angle, 0, 0, 1.0f); 

//Testing translation 
Matrix.translateM(mRotationMatrix, 0, -.5f, .5f, 0f); 

// Combine the rotation matrix with the projection and camera view 
Matrix.multiplyMM(mvpMatrix, 0, mRotationMatrix, 0, mvpMatrix, 0); 

miei Shaders (dichiarati a livello di classe)

private final String vertexShaderCode = 
"uniform mat4 uMVPMatrix;" + 

"attribute vec4 vPosition;" + 
"void main() {" + 
" gl_Position = uMVPMatrix * vPosition;" + 
"}"; 

private final String fragmentShaderCode = 
"precision mediump float;" + 
"uniform vec4 vColor;" + 
"void main() {" + 
" gl_FragColor = vColor;" + 
"}"; 

Da onSurfaceChanged

float ratio = (float) width/height; 
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 

Nel mio metodo onDrawFrame

// Set the camera position (View matrix) 
Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 

//Calculate the projection and view transformation 
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 

risposta

0

La rotazione di solito si verifica intorno all'origine, quindi si desidera ruotare il quad prima di tradurlo. Se si ruota dopo aver eseguito la traduzione, il quad verrà prima spostato dall'origine, quindi ruotato attorno all'origine.

Senza sapere come viene implementata la funzione Matrix, non è possibile indicare se le si sta utilizzando correttamente. Tutto ciò che ci hai mostrato nell'interfaccia delle funzioni.

Ma in generale, ruotare prima del che si traduce.

+0

Ciao @Sebby Johanns. Grazie per il commento, non sto ruotando prima della traduzione al momento? Sarei grato se potessi spiegare in modo più dettagliato - Ho aggiunto altro codice - è abbastanza? Si prega di avvisare se avete bisogno di più (e quale parte avete bisogno) - grazie mille !! – Zippy

+0

Se la traduzione ha lo scopo di spostare il centro di rotazione, e non di spostare il quad, quindi si traduce, si ruota, si traduce. – mbeckish

+0

@mbeckish grazie per il commento, ho sentito persone dire 'traslate e traduci' ma devo ancora capirlo completamente, penso che tu voglia tradurre le xe y e poi tradurre nuovamente con i valori opposti (dici, 1,1 e poi -1, -1) - per favore potresti modificare per mostrare un esempio? Ho provato questo, ma non ho ottenuto nulla. Grazie! – Zippy

3

Ecco una soluzione. Diciamo che dovresti disegnare una teiera ... il modello Matrix sarebbe un'identità per cominciare. La forma è centrata sull'origine in questo modo:

pre rotate and translate

verificare questo è quello che hai prima di continuare ...

Una volta che hai si dovrebbe applicare la rotazione alla matrice del modello, compilarlo + eseguire - si ottiene una copia ruotata ...

rotated

volta che hai questo si può tradurre:

rotated and translated

Quindi per te, tutto ciò che devi fare sembra verificare quando la matrice di rotazione è identità, ad es. Matrix.setIdentityM (mRotationMatrix, 0); che la forma è al centro. Se non lo si sposta al centro.

Una volta nel centro, applicare la rotazione, ad es.

Matrix.setIdentityM(mRotationMatrix,0); 
    <as needed movement to center> 

    Matrix.rotate(mRotationMatrix, 0, -angle, 0, 0, 1.0f); 
    <any other translation you want> 

Fallo in pochi passi per semplificarti la vita in modo da vedere cosa sta succedendo.

+0

Ciao @paulczak - grazie per questo. il fatto è che, quando la forma è al centro, ruota perfettamente (perché il centro è al centro dello schermo). Tuttavia, se sposto la forma per dire l'angolo in alto a sinistra, ruota ancora o "orbita attorno al centro". Non sono sicuro di come tradurlo in modo che rimanga nello stesso posto? Quindi quando dici "una volta che hai questo puoi tradurre" - penso che sia dove sto cadendo, non sono sicuro di come fare questa traduzione? (Ordine del codice e come capire dove dovrebbe essere il centro). – Zippy

+0

Stai reimpostando la matrice di rotazione (dove stai facendo le trasformazioni del modello) all'identità su ogni chiamata di onDrawFrame()? – paulczak

+0

In realtà non avevo un Matrix.setIdentityM (mRotationMatrix, 0); line in là a tutti - ma l'ho aggiunto subito prima di usare setRotate. Sì, si chiama ogni frame. (Dal mio metodo rotateQuad() che viene chiamato dal mio metodo onDrawFrame()), il tuo aiuto è apprezzato, non riesco a capire cosa sto facendo male! – Zippy

5

Ho riscontrato gli stessi problemi (visto le strane distorsioni e tutto il resto), la mia soluzione basata sullo Android Training > Displaying Graphics with OpenGL ES > Adding Motion qui sotto.

(Head over al mio post dettagliato per in caso di necessità:. OpenGL ES Android Matrix Transformations)

  1. Impostare un mModelMatrix a matrice identità

    Matrix.setIdentityM(mModelMatrix, 0); // initialize to identity matrix 
    
  2. Applicare traduzione al mModelMatrix

    Matrix.translateM(mModelMatrix, 0, -0.5f, 0, 0); // translation to the left 
    
  3. applicare la rotazione di un mRotationMatrix (angoli in gradi)

    Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f); 
    
  4. Combinare rotazione e traslazione tramite Matrix.multiplyMM

    mTempMatrix = mModelMatrix.clone(); 
    Matrix.multiplyMM(mModelMatrix, 0, mTempMatrix, 0, mRotationMatrix, 0); 
    
  5. Unire la matrice modello con la sporgenza e vista telecamera

    mTempMatrix = mMVPMatrix.clone(); 
    Matrix.multiplyMM(mMVPMatrix, 0, mTempMatrix, 0, mModelMatrix, 0); 
    
+0

Differenziare il movimento e la rotazione (e successivamente moltiplicare due matrici) ha fatto il trucco. Basta notare che è necessaria l'inizializzazione della matrice di rotazione. –

0

Applicare le operazioni a ritroso:

di 1 ° Matrix.translateM (mRotationMatrix, 0, -.5f, .5f, 0f);

2nd- Matrix.setRotateM (mRotationMatrix, 0, -angle, 0, 0, 1.0f);

Ruoterà attorno al proprio centro