Подтвердить что ты не робот

Параллакс XY и расчет вращения - плитка

У меня есть этот код для рисования фона параллакса

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

Все работает хорошо, когда камера не поворачивается.

Когда он повернут, я думаю, что tile (this.mShape) следует рисовать еще четыре раза (сверху, снизу, влево и вправо), поэтому пустое пространство в углу не видно. Например, когда вращение составляет 45 градусов, но я не могу понять, как это сделать.

4b9b3361

Ответ 1

Кажется, из объяснения, что у вас есть набор элементов 2x2, и вы хотели бы повернуть их. Но когда вы делаете, есть пробелы в углах? поэтому вместо этого

    [][]
    [][]

2x2 плиточный набор сделать это

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

Набор плиток 3x3 и центрируйте его по центральным плиткам, затем залейте вокруг него.

Если важно, чтобы у вас был рисунок из 4 плиток с общим углом в центре, вам нужно будет сделать это

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

4x4 Плитка. В основном просто создавайте свои 2x2. Теперь, когда вы вращаете свой фон, в углах не будет зазора.

Остальная id просто математика.

В opengl вы вращаете мир, а не объект. Поэтому, чтобы думать об этом, вы вращаете плоскости x, y, z из

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

слишком

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

так что теперь геометрия будет повернута до положения, которое было нарисовано плюс вращение. Поэтому, если бы у меня была квадратура с углом в x, y, z (10,0,0), эта точка все равно была бы на (10,0,0), но ось X была бы повернута, скажем, 45 ', поэтому объект будет (10,0) под углом 45 футов на плоскости XY.

Итак, все дело в перерисовывании вашей плитки при смещениях.