Современный OpenGL Вопрос - PullRequest
7 голосов
/ 27 июня 2011

В своем исследовании OpenGL (я думаю, что Красная книга OpenGL) я натолкнулся на пример модели шарнирного манипулятора робота, состоящего из «плеча», «плеча», «руки» и пяти. или больше "пальцев". Каждая из секций должна быть в состоянии двигаться независимо, но ограничена «суставами» (верхние и нижние «руки» всегда соединены в «локте»).

В непосредственном режиме (glBegin / glEnd) они используют одну сетку куба, называемую «член», и используют масштабированные копии этой единственной сетки для каждой части руки, руки и т. Д. «Движения» были достигается путем нажатия поворотов на стек матрицы преобразования для каждого из следующих суставов: плечо, локоть, запястье, костяшка - вы получите изображение.

Теперь это решает проблему, но, поскольку он использует устаревший устаревший немедленный режим, я пока не понимаю решения этой проблемы в современном контексте OpenGL. У меня вопрос: как подойти к этой проблеме, используя современный OpenGL? В частности, должен ли каждый отдельный «член» отслеживать свою собственную текущую матрицу преобразования, поскольку стеки матриц уже не кошерны?

Ответы [ 3 ]

3 голосов
/ 27 июня 2011

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

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

def draw_linkage(body, view):

    //Draw the body using view matrix

    for child, relative_xform in body.edges:

        if visited[child]:
            continue

        draw_linkage(child, view * relative_xform)
1 голос
/ 27 июня 2011

Вы обычно делаете это на уровне выше openGL, используя сценограф.

Одна и та же матрица преобразуется в каждом узле дерева графа сцены, просто отображается просто на матрицы openGL, так что это довольно эффективно.

1 голос
/ 27 июня 2011

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

В случае «соединенных» / «непрерывных» сеток,Подобно лицу, анимация обычно происходит через кости и цели деформации.Каждое из них определяет деформацию, и каждой вершине в сетке присваивается вес, насколько сильно она подвержена влиянию каждого деформатора.Технически это может быть применено и к модели жестких конечностей, давая каждой конечности единичный деформатор, отличный от нуля.

Любая приличная система анимации отслеживает преобразования (матрицы) в любом случае, функции стека матрицы OpenGL используются редков серьезных приложениях (так как OpenGL был изобретен).Но обычно преобразования хранятся в иерархии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...