OpenGL, переведите вниз на y и поверните на z вокруг центра ELEMENT (на Android) - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть ортогональная перспектива, которую я инициализирую следующим образом:

gl.glViewport(0, 0, Constants.SCREEN_WIDTH, Constants.SCREEN_HEIGHT);   
gl.glMatrixMode(GL10.GL_PROJECTION);    
gl.glLoadIdentity();                    
gl.glOrthof(0,Constants.GAME_AREA_WIDTH, Constants.GAME_AREA_HEIGHT, 0, 1, 10);
gl.glMatrixMode(GL10.GL_MODELVIEW);     
gl.glLoadIdentity();

То, что я хочу сделать здесь, это иметь квадратное начало в верхней части экрана (как (x, -100, z) и тот квадрат должен опускаться (на y) и в то же время вращаться (на z).

Верхний левый квадрат - это то, что я использую в качестве ссылки для позиции квадрата.

Хорошо, теперь, я думаю, что я понимаю, как вращать это вокруг себя. Я перевожу вещь в (-squareSize / 2, -squareSize / 2, z), вращаю ее вдоль z, затем переводю обратно. И действительно, если я только проверяюэто вращение работает нормально:

    gl.glLoadIdentity();
    angle = angle + 3;
    if(angle>360) {
        angle = angle - 360;
    }
    gl.glTranslatef(xCurrent+size/2, yCurrent+size/2,0);
    gl.glRotatef(angle, 0, 0, 1);
    gl.glTranslatef(-(xCurrent+size/2), -(yCurrent+size/2),0);
//omitted: enable client state, draw elements, disable client state.

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

Однако я не могу понять, как добавить нисходящий перевод на y. Если я сделаю что-то вроде этого:

    angle = angle + 3;
    if(angle>360) {
        angle = angle - 360;
    }
    gl.glTranslatef(xCurrent+size/2, yCurrent+size/2,0);
    gl.glRotatef(angle, 0, 0, 1);
    gl.glTranslatef(-(xCurrent+size/2), -(yCurrent+size/2),0);

    yCurrent = yCurrent + realSpeed;
    if(yCurrent>Constants.GAME_AREA_HEIGHT+size) {
        yCurrent=-size;
    }
    gl.glTranslatef(0f, yCurrent,0f);

, это будет работать нормально только если мой квадратный стартat (0,0, z) - в этом случае он будет двигаться вниз и вращаться вокруг своей осиnter.

Если, однако, я начну с любого положительного или отрицательного значения, отличного от 0, для x или y, он все равно будет двигаться вниз, но совершит странное спиральное движение, вместо вращения против своего центра.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Умножение столбца стека матрицы OpenGL.Что фактически означает, что вы должны выполнять самое локальное преобразование последним.

Итак, что вы, вероятно, хотите сделать, это выполнить glTranslatef для текущей позиции тайла, а затем выполнить последовательность translate / rotate / untranslate, чтобы выполнитьваше вращение.

0 голосов
/ 05 августа 2015

Примечание редактора: Этот ответ был перенесен из вопроса редактирования, он написан Оригинальным автором.

Прежде всего, то, что Томми говорит в ответе ниже, правильно, я долженсначала закодируйте перевод в новую позицию, а затем добавьте строки кода, которые переводят / вращают / переводят.

Кроме того, значения I присваиваются значениям x и y, когда требуется перевести центр квадрата вкоординаты (0,0, z) просто неверны, я их просчитал.Основная идея здесь заключается в следующем.Допустим, у квадрата есть следующие вершины:

private static float xLeft = -0.75f;
private static float xRight = +0.25f;
private static float yTop = 2f;
private static float yBottom = 1f;
protected static float vertices[] = { 
        //x      y        z
        xLeft,  yTop,    -5f,   //Top left      triangle1-1     triangle2-1
        xRight, yTop,    -5f,   //Top right     triangle1-2
        xLeft,  yBottom, -5f,   //Bottom left                   triangle2-3
        xRight, yBottom, -5f    //Bottom right  triangle1-3     triangle2-2
}; 

тогда суммы перевода, необходимые для размещения центра этого квадрата в (0,0, z):

private float xCenterTranslation = (xRight+xLeft)/2f;
private float yCenterTranslation = (yTop+yBottom)/2f;

и коддля перевода квадрата по оси y и одновременного его вращения по центру:

gl.glTranslatef(0, translationAmountLinearY, 0); //translate on y
//decrement Y translation for next rendering
translationAmountLinearY+=translationDeltaLinearY;

gl.glTranslatef(xCenterTranslation, yCenterTranslation, 0);//translate BACK from center
gl.glRotatef(rotationAmountZDegrees, 0, 0, 1);//rotate
gl.glTranslatef(-xCenterTranslation, -yCenterTranslation, 0);//translate to center
//increment z rotation for next rendering: 
rotationAmountZDegrees+=0.04f;
...