Повернуть треугольник в OpenGL - PullRequest
2 голосов
/ 02 февраля 2012

Я пытаюсь повернуть треугольник вокруг его центральной точки.Я знаю, что OpenGL вращается вокруг источника, поэтому мне нужно перевести среднюю точку в начало координат, затем повернуть и перевести обратно.Я закомментировал эту последнюю строку, чтобы убедиться, что она, по крайней мере, вращается вокруг своего центра в начале координат.Это не.Кажется, он вращается вокруг своего старого происхождения, несмотря на перевод ... Обратите внимание, что ccc4 и ccp генерируют float.Вот мой код:

ccColor4B colors[] = {
    ccc4(255, 0, 0, 255),
    ccc4(0, 255, 0, 255),
    ccc4(0, 0, 255, 255)
};

CGPoint vertices[] = {
    ccp(0,0),
    ccp(50,100),
    ccp(100,0),
};

CGPoint middle[] = {ccp(50,50)};
CGPoint origin[] = {ccp(0,0)};

// Rotate the triangle
glPushMatrix();
glTranslatef(-50, -50, 0);
glRotatef(45, 0, 0, 1.0);
// glTranslatef(50, 50, 0);

// Draw the triangle
glLineWidth(2);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
glColor4ub(0, 0, 255, 255);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);

// Revert rotation, we only want triangle to rotate 
glPopMatrix();

// Draw the points
glDisableClientState(GL_COLOR_ARRAY);

glPointSize(5);
glColor4ub(255, 255, 255, 255);
glVertexPointer(2, GL_FLOAT, 0, middle);
glDrawArrays(GL_POINTS, 0, 1);

glPointSize(5);
glColor4ub(0, 255, 0, 255);
glVertexPointer(2, GL_FLOAT, 0, origin);
glDrawArrays(GL_POINTS, 0, 1);

glEnableClientState(GL_COLOR_ARRAY);
// End points

Вот вывод:

1 2

1 Ответ

6 голосов
/ 02 февраля 2012

Вы должны думать о преобразованиях как о применении в обратном порядке относительно порядка, в котором вы их называете.

На самом деле, проще думать с точки зрения преобразования локальной системы координат (LCS), а не объекта, что позволяет мысленно применять преобразования в порядке их вызова.Чтобы вращаться вокруг центра, переведите LCS в центр, поверните, а затем снова переведите его обратно:

glTranslatef(50, 50, 0);
glRotatef(45, 0, 0, 1);
glTranslatef(-50, -50, 0);
...