java android math opengl-es andengine

java - Parallax XY y rotación-cálculo de azulejo



android math (1)

Tengo este código para dibujar mi fondo de paralaje

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 gira.

Cuando se gira, creo que el mosaico ( this.mShape ) se debe dibujar 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.


Parece de la explicación que tienes un juego de fichas de 2x2 y te gustaría rotarlas. Pero cuando lo haces hay lagunas en las esquinas? entonces, en lugar de hacer esto

[][] [][]

Juego de fichas 2x2 hacer esto

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

Set de 3x3 fichas y céntrelo en los mosaicos centrales, luego rellene alrededor de él.

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

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

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

El resto es solo matemáticas.

En OpenGL estás rotando el mundo, no el objeto. Entonces, para pensar de esta manera, está rotando los planos x, y, z de

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

también

/ / / / / / >< / / / / / /

así que ahora la geometría girará a la posición que se dibujó más la 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.