视差XY和旋转 - 瓦片计算

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)应该再绘制四次(上下左右),以便不会出现角落里的空白区域。例如,当旋转45度时,但我无法弄清如何实现。


你能放一张图片来解释问题吗?我觉得我知道你的意思,但我只是想确认一下。 - Tim
1个回答

4

从说明中看来,您有一个2x2的瓷砖组合,并想要旋转它们。但是当您这样做时,角落处会出现间隙?因此,不要这样做:

    [][]
    [][]

2x2瓷砖集能够实现以下功能:

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

3x3瓷砖组合并将其居中放置在中央瓷砖上,然后填充周围。

如果您希望具有公共角落的4个瓷砖模式位于中心,则必须执行此操作。

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

4x4瓷砖集。基本上只是在2x2周围建造。现在当您旋转背景时,角落处将没有间隙。

其余的只是数学。

在OpenGL中,您正在旋转世界,而不是对象。因此,要像这样考虑,您正在从x、y、z平面旋转

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

也太

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

现在,几何图形将会旋转到绘制时的位置加上旋转角度。因此,如果我有一个正方形,其中一个角位于(x,y,z)(10,0,0),那么该点仍将位于(10,0,0),但X轴将被旋转45度,因此物体将以45度角出现在XY平面上距离原点(0,0,0) 10个X单位的位置。

所以,这只是关于在偏移量上重新绘制您的图块。


这就是我想要的 - 一个3x3的矩阵,因为这是用于2D引擎,所以z始终为0。我在数学方面遇到了问题,尝试过但没有成功。这就是为什么悬赏被激活的原因。 - Paweł
Opengl应该为您进行数学计算。如果您在z轴上旋转它,对象将被放置在它们应该在的位置。您只需要将它们放在正确的位置即可。因此,您需要将中心图块居中,然后放置周围的图块。因此,先放置中心图块,然后在(中心图块x +宽度,中心图块y),(中心图块x-宽度,中心图块y),(中心图块X,中心图块y +高度),(中心图块X,中心图块y-高度)等位置放置图块。 - WIllJBD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接