Как вы поворачиваете объект в OpenGL на определенное количество градусов?Есть ли встроенная команда или мне нужно использовать формулу? - PullRequest
0 голосов
/ 28 января 2012

Как вы поворачиваете объект в OpenGL на определенное количество градусов? Есть ли встроенная команда или мне нужно использовать формулу? Я застрял в этом вопросе в течение нескольких дней. Это программа, которая рисует фигуру под моей мышью во время движения.

Скажите, у меня есть функция рисования:

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glColor3f ( 1, 1, 1 );
glBegin (toggle_type );

//Where cur_x and cur_y is the current mouse location that gets auto-updated
//ratiox is 0.7 and ratioy is 0.6
if (toggle_type==GL_QUADS) //rectangle from (-length, -length) to (length,length) 
{
    glVertex2f ( cur_x- length*ratiox, cur_y + length*ratioy );
    glVertex2f ( cur_x+ length*ratiox, cur_y + length*ratioy );
    glVertex2f ( cur_x+ length*ratiox, cur_y- length*ratioy );
    glVertex2f ( cur_x-  length*ratiox, cur_y- length*ratioy );
}
else if (toggle_type==GL_TRIANGLES)//triangle with vertices (-length, -length), (length, -length), (0, length).
{
    glVertex2f ( cur_x- length, cur_y - length );
    glVertex2f ( cur_x+length, cur_y - length );
    glVertex2f ( cur_x, cur_y + length );
}

else if (toggle_type==GL_LINES) //line brush with vertices (0,-length), (0,length)
{

    glVertex2f ( cur_x, cur_y - length );
    glVertex2f ( cur_x, cur_y + length );
}

Я не могу просто использовать glRotatef (), прежде чем использовать glBegin, могу ли я? Я хочу повернуть способ, которым он нарисован вокруг моей мыши, на определенное количество градусов. Разве нет встроенной функции? Какую формулу я должен использовать, если нет?

Ответы [ 3 ]

3 голосов
/ 28 января 2012

Вам необходимо научиться использовать преобразования OpenGL: glTranslate, glRotate и glScale.

Перевести означает «переместить вещи». Масштаб означает «сделать вещи больше или меньше». Поворот означает, что это звучит, как это означает.

С преобразованиями OpenGL это помогает думать об изменении системы координат каждый раз, когда вы выполняете преобразование.

Итак, для этого допустим, что вы рисуете рамку вокруг курсора. Сначала переведите курсор мыши в положение. Вот где вы хотите сделать свой рисунок. Затем вращайте систему координат вокруг курсора, чтобы вы могли легко нарисовать прямоугольник без необходимости делать смешные вещи с синусами, косинусами и углами. Затем масштабируйте объект до нужного вам размера - это сжимает или расширяет систему координат. Наконец, просто нарисуйте прямоугольник размером в одну единицу вокруг начала координат (0,0), и он появится на экране в нужном вам месте, повороте и размере.

Если вы попытаетесь повернуть перед переводом, вы получите неверные результаты. Техническая причина этого заключается в том, что OpenGL перемножает матрицы преобразования на векторы вершин.

И, да, вы должны выполнять все преобразования вне вашего начального / конечного блока. Ваш начальный / конечный блок предназначен только для указания вершин, нормалей и т. Д.

1 голос
/ 28 января 2012

Я просто играл с freeglut, чтобы посмотреть, могут ли работать несколько окон (кажется, работает!), И я использовал ротации, чтобы увидеть некоторые изменения в отображении:

#include <cstdio>
#include <cassert>
#include <GL/freeglut.h>

#define DEGREES_X_SEC 10.0
int w_dc, w_ds;
float yRotationAngle;

void DrawSphere()
{
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glRotatef(yRotationAngle, .3f, .3f, .3f);
    glutWireSphere(.3, 20, 20);
    glFlush();
    glutSwapBuffers();
}
void DrawCube()
{
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glRotatef(yRotationAngle, .2f, .2f, .2f);
    glutWireCube(.5);
    glFlush();
    glutSwapBuffers();
}
void Idle()
{
    static int previousTime = 0;
    int currentTime = glutGet(GLUT_ELAPSED_TIME);
    if (currentTime - previousTime > 10)
    {
        float x_frame = (DEGREES_X_SEC / 1000.0) * (currentTime - previousTime);
        yRotationAngle += x_frame;
        glutPostWindowRedisplay(w_dc);
        glutPostWindowRedisplay(w_ds);
        previousTime = currentTime;
    }
}

// other code here....

int main(int argc, char *argv[])
{
    // let glut eat any command line args that it owns
    glutInit(&argc, argv);

    // full color, double buffered
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);

    w_dc = make_window("cube", DrawCube);
    glutPositionWindow(100, 100);

    w_ds = make_window("sphere", DrawSphere);
    glutPositionWindow(200, 200);

    // not bound to any window
    glutIdleFunc(Idle);

    glutMainLoop();
    return 0;
}

HTH, конечно, требуется freeglut...

0 голосов
/ 07 января 2016

вам нужно сфокусировать аллеграический материал, такой как c 5 и m2, это автоматическое вращение, и оно будет немедленно вознаграждено правительством, потому что оно показывает ненормальное поведение, дайте мне знать, если это поможет.

Рог.

...