2013-08-22 3 views
1

Я пытаюсь повернуть изображение вокруг его центра и масштабировать его до разрешения экрана телефона (в android).Вращение и масштабирование изображения в Opengl ES 2.0

Вот мой код:

// ---------------------------------------- 
// Scaling: 
float scaleWidth = 2/screenWidth; 
float scaleHeight = 2/screenHeight; 

// ---------------------------------------- 
// Start position of the picture 
int x = 60; 
int y = 60; 
float startX = x*scaleWidth; 
float startY = y*scaleHeight; 
// End position of the picture 
float endX = (x + bmpWallSize) * scaleWidth; 
float endY = (y + bmpWallSize) * scaleHeight; 
// Center of the bitmap: 
float midX = (x + (bmpWallSize/2)) * scaleWidth; 
float midY = (y + (bmpWallSize/2)) * scaleHeight; 

// ---------------------------------------- 
// Rotating: 
gl.glTranslatef(midX, midY, 0f); 
gl.glRotatef(r,0, 0,-1); 
gl.glTranslatef(-midX, -midY, 0); 

r++; if (r > 360) r = 1; 

без вращения картина выглядит нормально, но как только он вращается он изменяет размер (площадь становится прямоугольник). Я думаю, что это потому, что мне нужно масштабировать вершины изображения после вращения, а не раньше, но я не знаю, как это сделать. Я много искал в googled, но не мог найти ответа. Спасибо за любую помощь

+0

Глупый вопрос: Вы пробовали переключать X и Y для масштабирования? – hexafraction

ответ

1

Я нашел решение:

Эта функция может вычислить повернутые угловые точки куба:

public Point GetRotatedRecPoint(int degree, int cubeSize, Point centerPoint) { 
    degree = 360 - degree; 
    float length = (float) Math.sqrt(((cubeSize/2)*(cubeSize/2)) + ((cubeSize/2)*(cubeSize/2))); 
    float x = Math.cos(Math.toRadians(degree)); 
    float y = Math.sin(Math.toRadians(degree)) 
    return new Point(x*length + centerPoint.x, y*length + centerPoint.y); 
} 

так:

// The degrees of each Corner of the Cube 
int topLeftDegree = r+45; 
int topRightDegree = r+135; 
int botRightDegree = r+225; 
int botLeftDegree = r+315; 

Point topLeftPoint = new Point(GetRotatedRecPoint(topLeftDegree, cubeSize, centerPoint)); 
Point topRightPoint = new Point(GetRotatedRecPoint(topRightDegree, cubeSize, centerPoint)); 
Point botRightPoint = new Point(GetRotatedRecPoint(botRightDegree, cubeSize, centerPoint)); 
Point botLeftPoint = new Point(GetRotatedRecPoint(botLeftDegree, cubeSize, centerPoint)); 

после этого, я его масштаб:

topLeftPoint.x = topLeftPoint.x * widthScale; 
topLeftPoint.y = topLeftPoint.y * heightScale; 
topRightPoint.x = topRightPoint.x * widthScale; 
..... 

добавьте его в verticeBuffer, а затем нарисуйте его. Это работает без использования glTranslatef() или glRotatef(). Я уверен, что это не лучшее решение, но оно отлично работает для меня ^^

Смежные вопросы