Шнурная система и устройства? - PullRequest
0 голосов
/ 08 мая 2011

Как изменить стандартную систему кабелей и устройства в OpenGL?

В настоящее время используется стандартное значение, то есть оно изменяется от -1,0 (слева) до 1,0 (справа), где 0 - источник (то же самое, что иY, -1,0 сверху, 1,0 снизу).

Оптимально я бы 1) захотел изменить единицы измерения примерно до того же количества пикселей.Например, на дисплее 800x600 он может быть от -400 до 400 (по x) и от -300 до 300 (по y).Похоже, было бы легче работать с -1,0 до 1,0

2) Бонусные баллы: как изменить х / у?Один игровой движок, который я видел, имел бы значение от 0 до maxWidth и от 0 до maxHeight.

То есть 0,0 было сверху слева, а 800 600 - снизу справа.(0, 600 будет слева внизу, а 800,0 - вверху справа)

Я думаю, что оба они имеют отношение к команде viewpoint, но не знаю, полностью ли я ее понимаю.

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

Первый ответ на ваш последний пункт: нет комманда "viewpo i nt". Существует glViewport , который определяет отображение из так называемого пространства клипа [-1,1] × [-1,1] × [-1,1] в пространство окна / экрана - важно: glViewport не устанавливает какое-либо ограничение, поэтому, если ваш видовой экран покрывает только небольшую, среднюю часть вашего окна, то объекты, которые превышают область просмотра при рендеринге, могут / будут вызывать артефакты за пределами области просмотра. Тестирование ножницами (включается и устанавливается с помощью * glEnable (GL_SCISSOR_TEST) * и glScissor ) выполняет такое ограничение, которое также работает в области просмотра (хорошо для реализации выделения резиновых полос!).

Теперь рассмотрим ваш первый вопрос: система координат OpenGL - это то, что вы хотите; в OpenGL-3.1 и OpenGL-4 вообще нет системы координат по умолчанию! В OpenGL-2 и ниже существует ряд так называемых матриц преобразования , наиболее важно модель просмотра и проекция .

Вы можете думать, что проекция - это своего рода объектив камеры (хотя он работает совершенно иначе). Что делает, так это то, что он преобразует пространство world (или представление модели) в вышеупомянутое пространство клипа . Именно эта матрица проекции позволяет вам отображать любую аффинную систему координат в пространство клипа. OpenGL до версии 3 предоставляет вспомогательные функции glFrustum и glOrtho для наиболее часто используемых проекций: перспектива и орто.

Давайте сами построим некоторую проекцию (это орто, но я бы хотел показать, как все работает на математической стороне). Скажем, вы хотите отобразить x в [0; 200], у в [0; 100] до [-1; 1] (слева направо), [-1,1] (сверху вниз) и оставьте z как есть. Тогда

x_clip = -1 + x*(1-(-1))*(200-0) = -1 + x*2/200
y_clip =  1 + y*(-1  1 )*(100-0) =   1 + x*(-2)/100
z_clip = z

Это переводится в следующую матрицу:

2/200      0     0    -1
    0 -2/100     0     1
    0      0     1     0
    0      0     0     1

Теперь вы можете поместить это в матрицу проекции, используя glLoadMatrix .

Матрица modelview используется для перемещения вещей в мировом пространстве. Он также используется для определения точки обзора: в OpenGL нет камеры. Вместо этого мы просто перемещаем весь мир в противоположность тому, как мы переместили камеру в мире к желаемой точке обзора (на этот раз ... точка, а не ... порт!)

1 голос
/ 08 мая 2011

glOrtho():

#include <GL/glut.h>

unsigned int win_w = 0;
unsigned int win_h = 0;

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, win_w, win_h, 0, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3ub(255,0,0);
    glPushMatrix();
        glScalef(50,50,50);
        glBegin(GL_QUADS);
            glVertex2f(0,0);
            glVertex2f(1,0);
            glVertex2f(1,1);
            glVertex2f(0,1);
        glEnd();
    glPopMatrix();

    glFlush();
    glutSwapBuffers();
}

void reshape(int w, int h)
{
    win_w = w;
    win_h = h;
    glViewport(0, 0, w, h);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(800,600);
    glutCreateWindow("Ortho);

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...