2012-08-27 27 views
12

tôi có mã này để vẽ nền sai tôiParallax XY và luân chuyển - tính ngói

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

Tất cả mọi thứ đang làm việc tốt khi camera không xoay.

Khi xoay, tôi nghĩ rằng gạch (this.mShape) nên được vẽ bốn lần nữa (trên cùng, dưới cùng, bên trái và bên phải) để không có khoảng trống trong góc hiển thị. Ví dụ, khi xoay là 45 độ, nhưng tôi không thể tìm ra cách để làm điều này.

+0

Bạn có thể đưa ra hình ảnh giải thích được sự cố không? Tôi nghĩ rằng tôi biết những gì bạn có ý nghĩa, nhưng tôi chỉ muốn chắc chắn. – Tim

Trả lời

4

Có vẻ như từ lời giải thích rằng bạn có bộ lát gạch 2x2 và bạn muốn xoay chúng. Nhưng khi bạn làm có những khoảng trống ở các góc? nên thay vì làm

[][] 
    [][] 

gạch 2x2 bộ này làm

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

3x3 ngói này thiết lập và tập trung nó trên gạch trung tâm, sau đó điền vào xung quanh nó.

Nếu điều quan trọng là bạn có một mô hình 4 ngói với góc phổ biến ở trung tâm thì bạn sẽ phải làm

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

4x4 Ngói bộ này. Về cơ bản chỉ cần xây dựng xung quanh 2x2 của bạn. Bây giờ khi bạn xoay nền của bạn sẽ không có khoảng trống trong các góc.

Id còn lại chỉ là toán học.

Trong phiên bản bạn đang xoay vòng thế giới, không phải đối tượng. Vì vậy, để nghĩ về nó như thế này bạn đang xoay x, y, z máy bay từ

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

quá

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

vì vậy bây giờ hình học sẽ xoay đến vị trí mà nó được rút ra cộng với vòng xoay. Vì vậy, nếu tôi đã có một sqare với một góc tại x, y, z (10,0,0) điểm đó vẫn sẽ là (10,0,0) nhưng trục X sẽ được quay nói 45 'để đối tượng sẽ apear 10 X-đơn vị khoảng cách từ nguồn gốc của (0,0,0) tại một góc 45 'trên mặt phẳng XY.

Vì vậy, tất cả chỉ là vẽ lại hình xếp của bạn, ở vị trí tắt.

+0

đây là những gì tôi muốn - một 3x3, z luôn luôn là 0 vì đây là cho động cơ 2d. Tôi có vấn đề với toán học trong này tôi đã cố gắng nhưng không có may mắn. Đó là lý do tại sao tiền thưởng được kích hoạt. –

+0

Opengl nên làm toán cho bạn. Nếu bạn xoay nó trên trục z, các đối tượng sẽ được đặt ở nơi chúng thuộc về. Bạn chỉ cần đặt chúng vào đúng vị trí. vì vậy bạn cần căn giữa ô giữa và sau đó đặt các ô xung quanh. do đó, đặt gạch trung tâm, đặt một lát gạch ở giữa (gạch trung tâm x cộng với chiều rộng, gạch trung tâm y), (trung tâm x - chiều rộng, gạch trung tâm y), (gạch trung tâm X, gạch giữa y + chiều cao), (gạch trung tâm X, ngói trung tâm y-height) v.v. – WIllJBD

Các vấn đề liên quan