Как перестать растягиваться в opengl - PullRequest
1 голос
/ 25 сентября 2019

Я создал Линии и когда я поворачиваю линию.Линия будет растянутой.Как я могу остановить растяжение во время вращения.Когда я изменю высоту в Орто, она не будет отображаться правильно.Когда Линия идет влево или вправо, она начинает растягиваться, но когда она достигнет главной точки, она придет в реальное положение.

#include<fstream>
#include<iostream>
#include<stdlib.h>
#include<glut.h>
using namespace std;
float yr = 0;
void introscreen();
void screen();
void screen1();
void PitchLadder();

int width = 1268;
int height = 720;

float translate =  0.0f;
GLfloat angle = 0.0f;

void display(void) {
    glClearColor(0, 0, 0, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-300, 300, -10, 25, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    static int center_x = 0;
    static int center_y = 0;
}

void specialKey(int key, int x, int y) {
    switch (key) {
    case GLUT_KEY_UP:
        translate += 1.0f;
        break;
    case GLUT_KEY_DOWN:
        translate -= 1.0f;
        break;
    case GLUT_KEY_LEFT:
        angle += 1.0f;
        break;
    case GLUT_KEY_RIGHT:
        angle -= 1.0f;
        break;
    }

    glutPostRedisplay();
}

void Rolling(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0, 1, 0);
    glPushMatrix();
    glRotatef(-angle, 0, 0, 1);
    glTranslatef(-10, translate,0);
    PitchLadder();
    glPopMatrix();
    glFlush();
}

void PitchLadder() {
    GLfloat y;
    GLfloat y2;
    GLfloat fSize[5];
    GLfloat fCurrSize;
    fCurrSize = fSize[2];
    for (y2 = -90.0f ; y2 <= 90.0f ; y2 += 10.0f) {
        glLineWidth(fCurrSize);
        glBegin(GL_LINES);
        glVertex3f(-50.0f , y2 , 0);
        glVertex3f(50.0f , y2 , 0);
        glEnd();
        fCurrSize += 1.0f;
        screen();
        screen1();
    }
}

void renderbitmap1(float x3, float y3, void *font1, char *string1) {
    char *c1;
    glRasterPos2f(x3, y3);
    for (c1=string1; *c1 != '\0'; c1++) {
        glutBitmapCharacter(font1, *c1);
    }
}

void screen(void) {
    glColor3f(0, 1, 0);
    char buf1[20] = { '\0' };
    for (int row1 = -90.0f; row1 <= 90 + yr; row1 +=10.0f) {
        sprintf_s(buf1,"%i", row1);
        renderbitmap1(70 , (yr+row1), GLUT_BITMAP_TIMES_ROMAN_24, buf1);
    }
 }

void renderbitmap2(float x4, float y4, void *font2, char *string2) {
    char *c1;
    glRasterPos2f(x4, y4);
    for (c1=string2; *c1 != '\0'; c1++) {
        glutBitmapCharacter(font2, *c1);
    }
}

void screen1(void) {
    glColor3f(0, 1, 0);
    char buf1[20] = { '\0' };
    for (int row1 = -90.0f; row1 <= 90 + yr; row1 +=10.0f) {
        sprintf_s(buf1,"%i", row1);
        renderbitmap2(-70 , (yr+row1), GLUT_BITMAP_TIMES_ROMAN_24, buf1);
    }
 }

int main(int arg, char** argv) {
    glutInit(&arg, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(width, height);
    glutInitWindowPosition(50, 100);
    glutCreateWindow("HUD Lines");
    display();
    glutDisplayFunc(Rolling);
    glutSpecialFunc(specialKey);
    glutMainLoop();
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

В ортогональной проекции координаты пространства просмотра линейно отображаются на координаты пространства клипа соответственно нормализованным координатам устройства.Нормализованное пространство устройства представляет собой куб с минимумом (-1, -1, -1) и максимумом (1, 1, 1).
Наконец, координаты в нормализованном пространстве устройства отображаются в прямоугольную область просмотра.

Если область просмотра является прямоугольной, то необходимо учитывать соотношение сторон, когда координаты пространства просмотра преобразуются в пространство отсечения.
Отображение нормализованных координат устройства в область просмотра искажает геометрию на обратную величинуСоотношение сторон окна просмотра.Это искажение должно быть компенсировано ортографической проекцией.

Когда ортографическая проекция установлена ​​на glOrtho(left, right, bottom, top, near, far), то определяется объем кубоида, который отображает (слева, снизу, рядом)до (-1, -1, -1) и (справа, сверху, далеко) до (1, 1, 1).
Нет необходимости, чтобы диапазон x и y ортографической проекции был равен порту просмотрапрямоугольник, бит пропорции (left-right)/(top-bottom) должен быть равен пропорции прямоугольника области просмотра, иначе геометрия будет нарушена.

double size = 200.0f;
double aspect = (double)width / (double)height;
glOrtho(-aspect*size/2.0, aspect*size/2.0, -size/2.0, size/2.0, -1.0, 1.0);
0 голосов
/ 25 сентября 2019

Размер вашего окна и орфографический «вид» не имеют одинакового соотношения сторон:

// This creates a window that's 1268 x 720 (a wide rectangle)
int width = 1268;
int height = 720;
glutInitWindowSize(width, height);    

// This creates a "view" that's 300 x 300 (a square)
glOrtho(-300, 300, -10, 25, 0, 1);    

«Вид» будет растянут, чтобы заполнить область просмотра (окно).Вы видите, что изображение размером 300 x 300 растягивается до 1268x720, что определенно делает горизонтальные линии более длинными, чем вертикальные линии, даже если они имеют одинаковую длину в коде.

Вы должны вызвать glOrtho, используя width и height переменные вашего окна:

glOrtho(0, width, 0, height, 0, 1);

Обратите внимание, что я изменил аргументы на (left = 0, right = width, bottom = 0, top = height, ...).Это позволяет работать с пространством координат экрана, которое похоже на 2D-рендеринг, но нижний левый угол равен (0,0), а верхний правый равен (width,height).

...