【问题标题】:Parallax XY and rotation - tile calculation视差 XY 和旋转 - 平铺计算
【发布时间】:2012-08-22 10:38:06
【问题描述】:

我有这段代码来绘制我的视差背景

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 度时,但我不知道该怎么做。

【问题讨论】:

  • 你能放一张图片来解释这个问题吗?我想我知道你的意思,但我只是想确定一下。

标签: java android math opengl-es andengine


【解决方案1】:

从解释看来,您有一组 2x2 的图块,并且您想旋转它们。但是当你这样做的时候,角落里有缝隙吗?所以不要这样做

    [][]
    [][]

2x2 瓦片组这样做

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

3x3 瓷砖套装 并将它放在中心瓷砖上,然后在它周围填充。

如果重要的是你有一个 4 瓷砖图案,中间有一个公共角,那么你将不得不这样做

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

4x4 瓷砖套装。基本上只是围绕你的 2x2 构建。现在,当您旋转背景时,角落不会有间隙。

其余的 id 只是数学。

在 opengl 中,您正在旋转世界,而不是对象。所以要这样想,你正在从

旋转 x,y,z 平面
        |
        |
    ---------
        |
        |

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

所以现在几何图形将旋转到它被绘制的位置加上旋转。因此,如果我在 x,y,z (10,0,0) 处有一个角的正方形,该点仍将位于 (10,0,0) 但 X 轴将旋转 45' 所以对象将在 XY 平面上以 45' 角与 (0,0,0) 的原点相距 10 X 单位距离。

所以这只是关于在偏移处重绘你的图块。

【讨论】:

  • 这就是我想要的 - 一个 3x3 ,z 始终为 0,因为这是用于 2d 引擎的。我在这方面有数学问题,我试过但没有运气。这就是激活赏金的原因。
  • Opengl 应该为您计算。如果在 z 轴上旋转它,对象将被放置在它们所属的位置。您只需将它们放置在正确的位置即可。所以你需要将中心瓷砖居中,然后放置周围的瓷砖。所以放置中心瓷砖,将瓷砖放置在(中心瓷砖x加宽度,中心瓷砖y),(中心瓷砖x - 宽度,中心瓷砖y),(中心瓷砖X,中心瓷砖y +高度),(中心瓷砖X,中心瓷砖 y 高度)等等
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多