2012-08-27 3 views
12

Ho questo codice per disegnare il mio background di parallasseParallax XY e la rotazione - il calcolo delle mattonelle

pGLState.pushModelViewGLMatrix(); 
final float cameraWidth = pCamera.getWidth(); 
final float cameraHeight = pCamera.getHeight(); 
final float shapeWidthScaled = this.mShape.getWidthScaled(); 
final float shapeHeightScaled = this.mShape.getHeightScaled(); 

//reposition 

float baseOffsetX = (pParallaxValueX * this.mParallaxFactorX); 
if (this.mRepeatX) { 
    baseOffsetX = baseOffsetX % shapeWidthScaled; 
    while(baseOffsetX > 0) { 
      baseOffsetX -= shapeWidthScaled; 
    } 
} 

float baseOffsetY = (pParallaxValueY * this.mParallaxFactorY); 
if (this.mRepeatY) { 
    baseOffsetY = baseOffsetY % shapeHeightScaled; 
    while(baseOffsetY > 0) { 
     baseOffsetY -= shapeHeightScaled; 
    }        
} 

//draw 

pGLState.translateModelViewGLMatrixf(baseOffsetX, baseOffsetY, 0); 
float currentMaxX = baseOffsetX; 
float currentMaxY = baseOffsetY; 
do {  

    //rows  

    this.mShape.onDraw(pGLState, pCamera); 
    if (this.mRepeatY) { 
     currentMaxY = baseOffsetY; 

     //columns 

     do {  
      pGLState.translateModelViewGLMatrixf(0, shapeHeightScaled, 0); 
      currentMaxY += shapeHeightScaled;            
      this.mShape.onDraw(pGLState, pCamera); 
     } while(currentMaxY < cameraHeight);  

     //end columns 

     pGLState.translateModelViewGLMatrixf(0, -currentMaxY + baseOffsetY, 0);          
    } 

pGLState.translateModelViewGLMatrixf(shapeWidthScaled, 0, 0); 
currentMaxX += shapeWidthScaled; 
} while (this.mRepeatX && currentMaxX < cameraWidth); 

//end rows 

pGLState.popModelViewGLMatrix(); 

tutto funziona bene quando la fotocamera non viene ruotata.

Quando viene ruotato, penso che le mattonelle (this.mShape) debbano essere disegnate altre quattro volte (in alto, in basso, a sinistra ea destra) in modo che nessuno spazio vuoto nell'angolo sia visibile. Ad esempio, quando la rotazione è di 45 gradi, ma non riesco a capire come farlo.

+0

Riesci a mettere su un'immagine che spiega il problema? Penso di sapere cosa intendi, ma voglio essere sicuro. – Tim

risposta

4

Sembra dalla spiegazione che si dispone di un set 2x2 di tessere e si desidera ruotarle. Ma quando lo fai ci sono degli spazi vuoti negli angoli? Così, invece di fare questo

[][] 
    [][] 

piastrelle 2x2 insieme fare questa tessera 3x3

[][][] 
    [][][] 
    [][][] 

impostato e centrarlo sulle piastrelle del centro, quindi compilare intorno ad esso.

Se è importante che si dispone di un modello di 4 piastrelle con l'angolo comune al centro, allora si dovrà fare questo

[][][][] 
    [][][][] 
    [][][][] 
    [][][][] 

set 4x4 Tile. Fondamentalmente basta costruire attorno al tuo 2x2. Ora quando ruoti lo sfondo non ci sarà spazio negli angoli.

Il resto è solo matematica.

In opengl state ruotando il mondo, non l'oggetto. Così pensare a come questo si stanno ruotando x, y, z aerei da

 | 
     | 
    --------- 
     | 
     | 

troppo

 \ /
     \ /
     \/
     >< 
    /\ 
    / \ 
    / \ 

così ora la geometria viene ruotato alla posizione cui sono state estratte più rotazione. Quindi se avessi un sqare con un angolo in x, y, z (10,0,0) quel punto sarebbe ancora a (10,0,0) ma l'asse X sarà stato ruotato dire 45 'quindi l'oggetto sarà apri 10 unità X di distanza dall'origine di (0,0,0) con un angolo di 45 'sul piano XY.

Quindi tutto ciò che si tratta è ridisegnare la tua tessera, a scostamenti.

+0

questo è quello che voglio - un 3x3, z è sempre 0 perché questo è per il motore 2d. Ho problemi con la matematica in questo ho provato ma senza fortuna. Ecco perché la taglia è attivata. –

+0

Opengl dovrebbe fare la matematica per te. Se lo si ruota sull'asse z, gli oggetti saranno posizionati al loro posto. Devi semplicemente metterli nei punti giusti. quindi è necessario centrare la tessera centrale e posizionare le tessere circostanti. quindi posiziona la tessera centrale, posiziona una tessera al centro (piastrelle x più larghezza, centro tessere y), (centertile x - larghezza, centro piastrella y), (al centro piastrella X, al centro piastrella y + altezza), (al centro piastrella X, altezza tessera centrale y e così via – WIllJBD