2012-08-27 11 views
12

Mam ten kod za zwrócenie mojej paralaksy tłaParallax XY i rotacja - obliczenie dachówka

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

wszystko działa dobrze, gdy aparat nie jest obracany.

Kiedy jest obrócona, myślę, że kafelek (this.mShape) powinien zostać narysowany jeszcze cztery razy (góra, dół, lewo i prawo), aby nie było widać pustego miejsca w rogu. Na przykład, gdy obrót wynosi 45 stopni, ale nie mogę wymyślić, jak to zrobić.

+0

Czy możesz umieścić obraz wyjaśniający problem? Chyba wiem, co masz na myśli, ale chcę się tylko upewnić. – Tim

Odpowiedz

4

Z wyjaśnienia wynika, że ​​masz zestaw 2x2 płytek i chciałbyś je obrócić. Ale kiedy to robisz, w rogach są luki? więc zamiast robić to

[][] 
    [][] 

płytek 2x2 zestaw to zrobić

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

3x3 dachówka ustawić i wyśrodkować go na płytki środkowej, a następnie wypełnić wokół niego.

Jeśli ważne jest, że masz wzór 4 płytki z wspólnym rogu w centrum następnie trzeba będzie zrobić to

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

4x4 Płytka zestawu. Zasadniczo po prostu buduj wokół swojego 2x2. Teraz, gdy obrócisz tło, nie będzie luki w rogach.

Reszta to po prostu matematyka.

W opengl obracasz świat, a nie obiekt. Więc myśleć o tym tak jesteś obracanie osi X, Y, Z samolotów z

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

zbyt

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

więc teraz geometria zostanie obrócony do pozycji, która została pobrana oraz rotacji. Więc gdybym miał sqare z rogiem na x, y, z (10,0,0), to punkt byłby nadal na (10,0,0), ale oś X zostanie obrócona powiedzmy 45 ', więc obiekt będzie odejść 10 jednostek X odległości od początku (0,0,0) pod kątem 45 ° na płaszczyźnie XY.

Więc wszystko to jest o przerysowaniu twojego kafelka, na offsetach.

+0

tego właśnie chcę - 3x3, z zawsze jest 0, ponieważ jest to dla silnika 2d. Mam problem z matematyką w tym, co próbowałem, ale bez powodzenia. Właśnie dlatego aktywowano nagrodę. –

+0

Opengl powinien zrobić dla ciebie matematykę. Jeśli obrócisz go na osi Z, obiekty zostaną umieszczone tam, gdzie ich miejsce. Musisz po prostu umieścić je w odpowiednich miejscach. więc musisz wyśrodkować środkową płytkę, a następnie umieścić otaczające ją płytki. więc umieść środkową płytkę, miejsce płytkę na (środkowe płytki x plus szerokość, środkowe płytki y), (centertile x - szerokość, środkowa płytka y), (środkowa płytka X, środkowa płytka y + wysokość), (środkowa płytka X, środkowa płytka y-wysokość) i tak dalej – WIllJBD