Как мы поворачиваем фигуру в 2d в openGL относительно точки (кроме начала координат)? - PullRequest
4 голосов
/ 04 июня 2011

Использование функции glrotatef() поворачивает фигуру на заданный угол относительно начала координат.Как повернуть ту же фигуру относительно другой точки, не используя матрицы преобразования вручную?Спасибо!

void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    gluOrtho2D(0,499,0,499);
    glMatrixMode(GL_PROJECTION);
    glColor3f(1,0,0);
    drawhouse();
    glFlush();
    glColor3f(0,0,1);
    glTranslatef(0.5 ,0.5,0.5);
    glRotatef(45,1,1,1);
    glTranslatef(-0.5 ,-0.5,-0.5);
    drawhouse();
    glFlush();
}

Вот скриншот того, что происходит.http://postimage.org/image/q81bhupw/

Ответы [ 2 ]

7 голосов
/ 04 июня 2011

В основном:

Если вы хотите повернуть вокруг P, переведите на -P (чтобы P переместился к началу координат), затем выполните вращение, а затем переведите на P (чтобы источник переместился обратно к P).

glTranslatef(P.x, P.y, P.z);
glRotatef(angle, A.x, A.y, A.z);
glTranslatef(-P.x, -P.y, -P.z);

(Примечание. Это в «обратном порядке», поскольку последнее добавленное преобразование является первым, примененным в соответствии с правилами OpenGL.)

Итак, в вашем коде настройки вам нужны эти вызовы:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 499, 0, 499);
glMatrixMode(GL_MODELVIEW);

И тогда ваш display() метод должен выглядеть примерно так:

void display() {
    glClear(GL_COLOR_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(0.5f, 0.5f, 0.5f);
    glRotatef(45.f, 1.f, 1.f, 1.f);
    glTranslatef(-0.5f, -0.5f, -0.5f);
    glColor3f(0.f, 0.f, 1.f);
    drawhouse();
    glFlush();
}
2 голосов
/ 04 июня 2011

Ваш код - полная чушь.Во-первых, вы должны применить преобразование к матрице Моэлвью, а не к матрице проекции.Во-вторых, вы должны превратить ваше преобразование в glPushMatrix/glPopMatrix, иначе они не будут перевернуты при рендеринге следующего кадра.В-третьих, вы должны применить gluOrtho2d к матрице проекции, а не к матрице вида модели.

В соответствии с ответом Джона ваш код должен выглядеть следующим образом:

void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,499,0,499);
    glMatrixMode(GL_MODELVIEW);
    glColor3f(1,0,0);
    drawhouse();
    glFlush();
    glColor3f(0,0,1);
    glPushMatrix();
        glTranslatef(0.5 ,0.5,0.5);
        glRotatef(45,1,1,1);
        glTranslatef(-0.5 ,-0.5,-0.5);
        drawhouse();
    glPopMatrix();
    glFlush();
}

РЕДАКТИРОВАТЬ: Даже (или потому что) вы боитесь матриц, я предлагаю вам прочитать некоторые вводные материалы по векторным и матричным операциям и преобразованиям.Также вам следует прочитать некоторые вводные материалы по OpenGL, чтобы по-настоящему понять, как они работают, особенно принцип конечного автомата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...