12

視差の背景を描画するためのこのコードがあります

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

カメラが回転していない場合、すべてが正常に機能しています。

this.mShape回転させると、タイル ( ) をさらに 4 回 (上下左右) 描画する必要があると思います。たとえば、回転が 45 度の場合、これを行う方法がわかりません。

4

1 に答える 1

4

説明から、2x2 のタイル セットがあり、それらを回転させたいと思われます。しかし、そうすると角に隙間ができますか?これを行う代わりに

    [][]
    [][]

2x2 タイル セットはこれを行います

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

3x3 のタイル セットを中央のタイルの中央に配置し、その周りを塗りつぶします。

中央に共通コーナーがある 4 タイル パターンが重要な場合は、これを行う必要があります。

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

4x4 タイル セット。基本的には、2x2 を中心に構築するだけです。背景を回転させると、角に隙間がなくなります。

残りはただの数学です。

OpenGL では、オブジェクトではなく、世界を回転させます。このように考えると、x、y、z 平面を回転させています。

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

それも

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

そのため、ジオメトリは、描画された位置に回転を加えた位置に回転します。したがって、x、y、z (10,0,0) にコーナーがある正方形がある場合、その点は (10,0,0) のままですが、X 軸は 45 ' と回転しているので、オブジェクトはXY 平面上で 45' の角度で (0,0,0) の原点から 10 X 単位の距離に表示されます。

つまり、オフセットでタイルを再描画するだけです。

于 2012-09-04T02:35:30.647 に答える