Поддерживать один и тот же треугольник относительно его координат как в начале координат, так и в заданных пользователем точках для вращения?

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

#include<GL/glut.h>
#include<stdio.h>
int x,y;
int where_to_rotate=2;

void draw_pixel(float x1,float y1)
{
    //glColor3f(0.0,0.0,1.0);
    glPointSize(5.0);
    glBegin(GL_POINTS);
        glVertex2f(x1,y1);
    glEnd();
}

void triangle(int x,int y)
{
    glColor3f(1.0,0.0,0.0);
    glBegin(GL_POLYGON); // this is what is bothering me.I have to maintain the same triangle even at user specified coordinates
        glVertex2f(x,y);
        glVertex2f(x+50,0);
        glVertex2f(0,y+50);
    glEnd();
}

float rotate_angle=0.0;
float translate_x=0.0,translate_y=0.0;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glColor3f(1,1,1);
    draw_pixel(0.0,0.0);
    if(where_to_rotate==1) //Rotate Around origin
    {
        translate_x=0.0;
        translate_y=0.0;
        rotate_angle+=.2;
        draw_pixel(0.0,0.0);
    }
    if(where_to_rotate==2) //Rotate Around Fixed Point
    {
        translate_x=x;
        translate_y=y;
        rotate_angle+=.2;
        glColor3f(0.0,0.0,1.0);
        draw_pixel(x,y);
    }
    glTranslatef(translate_x,translate_y,0.0); //works fine for origin
    glRotatef(rotate_angle,0.0,0.0,1.0);
    glTranslatef(-translate_x,-translate_y,0.0);
    triangle(translate_x,translate_y);
    glutPostRedisplay();
    glutSwapBuffers();
}

void myInit()
{
    glClearColor(0.0,0.0,0.0,1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-800.0, 800.0, -800.0, 800.0);
    glMatrixMode(GL_MODELVIEW);
}

void rotateMenu (int option)
{
    if(option==1)
        where_to_rotate=1;
    if(option==2)
        where_to_rotate=2;
    if(option==3)
        where_to_rotate=3;
}
int main(int argc, char **argv)
{
    printf( "Enter Fixed Points (x,y) for Rotation: \n");
    scanf("%d %d", &x, &y);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(800, 800);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Create and Rotate Triangle");
    myInit();
    glutDisplayFunc(display);
    glutCreateMenu(rotateMenu);
    glutAddMenuEntry("Rotate around ORIGIN",1);
    glutAddMenuEntry("Rotate around FIXED POINT",2);
    glutAddMenuEntry("Stop Rotation",3);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    glutMainLoop();
}

person Shankar Rajagopal    schedule 08.03.2018    source источник


Ответы (1)


В функции triangle вы должны применить перевод ко всем координатам вершин:

glVertex2f(x,y);
glVertex2f(x+50,y);
glVertex2f(x,y+50);

Обратите внимание, что достаточно задать матрицу модели и указать статическую геометрию треугольника, и glTranslatef(-translate_x,-translate_y,0.0);отменит перенос, который вы задали triangle(translate_x,translate_y);


Если вы хотите, чтобы треугольник сохранял свое положение и вращался вокруг фиксированной точки, то вы должны сделать это так:

glTranslatef(translate_x, translate_y, 0.0);
glRotatef(rotate_angle, 0.0, 0.0, 1.0);
glTranslatef(-translate_x, -translate_y, 0.0);
triangle(0.0, 0.0);


Объяснение:

  • Верхняя операция в стеке матриц преобразует треугольник таким образом, что его начало является точкой вращения:

glTranslatef(-translate_x, -translate_y, 0.0);

  • Вторая операция вращает треугольник вокруг его текущего начала.

glRotatef(rotate_angle,0.0,0.0,1.0);

  • Наконец, повернутый треугольник перемещается назад:

glTranslatef(translate_x, translate_y, 0.0);


См. также перевод OpenGL до и после поворота< /а>

person Rabbid76    schedule 08.03.2018