Позиционирование фигур / объектов - OpenGL - PullRequest
0 голосов
/ 15 октября 2011

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

Любой вклад, который приведет меня в правильном направлении, будет полезен.

Я использую C ++ с opengl.

Ответы [ 2 ]

2 голосов
/ 15 октября 2011

Поиск функции glTranslatef

В качестве примечания, возможно, вы захотите взглянуть также на glRotatef и glScalef.Если вы ничего не знаете о переводе, поищите матрицу перевода , сначала изучите ее в 2D, а затем в 3D.

0 голосов
/ 15 октября 2011

Я бы хотел изменить положение на окружность, треугольники, линии и дугу.

То есть вы уже нарисовали сцену и теперь хотите изменить положение объектов?

Итак, все, что вам нужно понять, это то, что OpenGL не поддерживает своего рода граф сцены. После отправки запроса на отрисовку, вещи получают только обновления в целевом кадровом буфере, и все. Вы хотите что-то изменить? Очистить экран, перерисовать все, но теперь с примененными настройками.

Действительно, OpenGL просто рисует вещи, это не более чем сложные кисти (текстуры) и карандаши (примитивы) для некоторой бумаги, предлагаемой операционной системой (область просмотра / окно).

РЕДАКТИРОВАТЬ согласно комментарию

Обычная интерактивная графическая программа OpenGL с анимацией, запрограммированная на императивном языке программирования, имеет такую ​​структуру (псевдокод)

float T = 0
float alpha = 0, beta = 0
float red = 0, green = 0, blue = 0

paused = false

on_mousemove(mousemove):
    alpha += mousemove.rel_x
    beta  += mousemove.rel_y

on_keypress(keypress):
    switch keypress.key:
        case Key_ESCAPE:
            queue_event(Quit)
            return

        case Key_PAUSE:
            paused = not paused

        case Key_R:
            red += 0.1
        case Key_r:
            red -= 0.1

        case Key_G:
            green += 0.1
        case Key_g:
            green -= 0.1

        case Key_B:
            blue += 0.1
        case Key_b:
            blue -= 0.1

    queue_event(Redraw)

render()
    glViewport(0, 0, window.width, window.height)

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    apply_projection()

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    apply_modelview()

    glColor3f(red, green, blue)
    glRotatef(T * x_revolutions_per_second_factor, 1, 0, 0)
    glRotatef(alpha, 0, 1, 0)
    glRotate(beta, 0, 0, 1)

    draw_object()

    SwapBuffers()

main:
    initialize_libraries()
    load_resources()
    create_window_and_OpenGL_context()

    previous_loop = get_time()

    loop 'eventloop':
        event = peek_event()
        switch event.type:
            case MouseMove:
                on_mousemove(event.mousemove)

            case KeyPress:
                on_keypress(event.keypress)

            case Quit:
                break 'eventloop'

            case Redraw:
                render()
                break

            case NoEvents:
                fallthrough
            default:
                if not paused
                    render()

        current_loop = get_time()
        if not paused:
            T += current_loop - previous_loop
        previous_loop = current_loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...