2012-08-27 12 views
12

que tienen este código para trazar mi fondo de paralajeParallax XY y la rotación - el cálculo de baldosas

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

todo funciona bien cuando la cámara no se gira.

Cuando se gira, creo que el mosaico (this.mShape) debe dibujarse cuatro veces más (arriba, abajo, izquierda y derecha) para que no quede espacio vacío en la esquina. Por ejemplo, cuando la rotación es de 45 grados, pero no puedo encontrar la manera de hacerlo.

+0

¿Puedes poner una imagen que explique el problema? Creo que sé a qué te refieres, pero solo quiero asegurarme. – Tim

Respuesta

4

Parece de la explicación que tiene un conjunto de mosaicos de 2x2 y le gustaría rotarlos. Pero cuando lo haces hay lagunas en las esquinas? así que en vez de hacer esto

[][] 
    [][] 

conjunto de mosaicos 2x2 hacer esto

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

baldosas de 3x3 establece y centrarla en las baldosas del centro, luego rellenar alrededor de ella.

Si es importante que usted tiene un patrón de 4 baldosas con la esquina común en el centro, entonces usted tendrá que hacer esto

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

conjunto 4x4 del azulejo. Básicamente, construye alrededor de tu 2x2. Ahora cuando gira su fondo no habrá espacio en las esquinas.

El resto es solo matemática.

En OpenGL está rotando el mundo, no el objeto. Por eso, pensar en ello como esto está girando el x, y, z de aviones

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

demasiado

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

por lo que ahora la geometría será girado a la posición que se haya extraído más rotación. Entonces, si tuviera un sqare con una esquina en x, y, z (10,0,0), ese punto estaría aún en (10,0,0) pero el eje X se habría girado, digamos 45 ', así el objeto apear 10 unidades X de distancia desde el origen de (0,0,0) en un ángulo de 45 'en el plano XY.

Así que todo lo que se trata de volver a dibujar su ficha, en las compensaciones.

+0

esto es lo que quiero - un 3x3, z es siempre 0 porque esto es para el motor 2d. Tengo un problema con las matemáticas en esto lo he intentado pero sin suerte. Es por eso que la recompensa está activada. –

+0

Opengl debe hacer los cálculos por usted. Si lo gira en el eje z, los objetos se colocarán donde pertenecen. Simplemente tiene que colocarlos en los lugares correctos. así que debes centrar el azulejo central y luego colocar los azulejos circundantes. así que coloque el azulejo central, coloque un azulejo en (baldosas centrales x más ancho, baldosas centrales y), (centetero x - ancho, baldosa central y), (baldosa central X, baldosa central y + altura), (baldosa central X, altura del y del centro del azulejo) y así sucesivamente – WIllJBD

Cuestiones relacionadas