2012-08-27 4 views
12

Ich habe diesen Code meine Parallaxe Hintergrund für das ZeichnenParallax XY und Rotation - Fliese Berechnung

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

Alles funktioniert gut, wenn die Kamera nicht gedreht wird.

Wenn es gedreht wird, denke ich, Kachel (this.mShape) sollte vier weitere Male (oben, unten, links und rechts) gezeichnet werden, so dass kein leerer Raum in der Ecke sichtbar ist. Zum Beispiel, wenn die Rotation 45 Grad ist, aber ich kann nicht herausfinden, wie das geht.

+0

Können Sie ein Bild aufstellen, das das Problem erklärt? Ich denke ich weiß was du meinst, aber ich will nur sichergehen. – Tim

Antwort

4

Es scheint von der Erklärung, dass Sie einen 2x2 Satz von Fliesen haben und Sie möchten sie drehen. Aber wenn du es tust, gibt es Lücken in den Ecken? so zu tun, anstatt diese

[][] 
    [][] 

2x2-Fliese Set tun dies

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

3x3 Fliese und zentrieren es auf den Mittel Fliesen, und füllen Sie dann um ihn herum.

Wenn es wichtig ist, dass Sie ein 4 Fliesenmuster mit der gemeinsamen Ecke in der Mitte haben, dann werden Sie das tun müssen

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

4x4 Fliese. Grundsätzlich baue einfach deine 2x2 um. Wenn Sie jetzt Ihren Hintergrund drehen, wird es keine Lücke in den Ecken geben.

Der Rest ID nur Mathe.

In opengl drehen Sie die Welt, nicht das Objekt. Also denken Sie daran, wie diese Sie die x drehen, y, z-Ebene von

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

zu

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

so nun die Geometrie in die Position gedreht wird, die sie gezogen wurde und Rotation. Also, wenn ich ein Quadrat mit einer Ecke bei x, y, z (10,0,0) hätte, wäre dieser Punkt immer noch bei (10,0,0), aber die X-Achse wäre um 45 ° gedreht worden, so dass das Objekt wird apear 10 X-Einheiten Entfernung vom Ursprung von (0,0,0) in einem 45 'Winkel auf der XY-Ebene.

Also alles was es ist ist über Ihre Zeichnung, bei Offsets neuzeichnen.

+0

das ist was ich will - ein 3x3, z ist immer 0, weil dies für 2d Motor ist. Ich habe ein Problem mit Mathe in diesem ich habe versucht, aber ohne Glück. Deshalb ist das Kopfgeld aktiviert. –

+0

OpenGL sollte die Mathematik für Sie tun. Wenn Sie es auf der Z-Achse drehen, werden Objekte dort platziert, wo sie hingehören. Sie müssen sie einfach an den richtigen Stellen platzieren. Also musst du das mittlere Plättchen zentrieren und dann die umliegenden Plättchen legen. Legen Sie also die mittlere Fliese, die Stelle, an der die Fliese liegt (mittlere Fliese x plus Breite, mittlere Fliese y), (mittlere x - Breite, mittlere Fliese y), (mittlere Fliese X, mittlere Fliese y + Höhe), (mittlere Fliese X, mittlere Fliese Y-Höhe) und so weiter – WIllJBD