Рисование нескольких связанных объектов в OpenGL

#c #opengl

#c #opengl

Вопрос:

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

На этом этапе мне удалось статически нарисовать arm, применив необходимые преобразования, а именно. перевод, поворот, масштабирование и т.д.

Теперь мне нужно сделать его интерактивным. То есть, когда пользователь выбирает определенный объект и перемещает его, меньшие объекты, прикрепленные к нему, должны перемещаться.

Пример: — Если пользователь перемещает руку, должны двигаться запястье, ладонь и пальцы, но не плечо. Аналогично, если выбрана ладонь и повернута вокруг запястья, только пальцы, прикрепленные к этой ладони, могут перемещаться вместе с ладонью, а не рука или запястье.

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

Ответ №1:

То, что вы здесь делаете, называется иерархией преобразований и фактически рассматривается в главе о преобразованиях в руководстве по программированию OpenGL-1.1 (последние версии OpenGL, а именно v3 и более поздние версии, в значительной степени урезали матричные манипуляции, поэтому вам нужно реализовать это самостоятельно, но принцип остается тем же).

Посмотрите в конец этой главы (я предлагаю вам прочитать ее целиком):

http://fly.cc.fer.hr /~unreal/theredbook/chapter03.html

Ответ №2:

Я не специалист, но я думаю, вам следует рассмотреть возможность использования инструментария поверх OpenGL. Может быть, что-то вроде OpenSceneGraph ( http://www.openscenegraph.org/projects/osg/wiki/About/Introduction )

Посмотрите введение в него здесь: http://www.artoolworks.com/support/library/An_Introduction_to_OpenSceneGraph_and_osgART

Это объясняет, что вы можете создавать «деревья объектов», которые будут связаны.

Ответ №3:

Я сам с ними не работал, но я знаю, что OpenGL отслеживает матрицы преобразования в стеке.

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

Проверьте эту страницу для получения более подробной информации (я сам ее не читал!):

http://fly.cc.fer.hr /~unreal/theredbook/chapter03.html

Это помогает? Это кажется применимым для простых случаев, подобных тому, что вы описываете. Для более сложных приложений Pascal T. прав в том, что вы можете захотеть просмотреть слои поверх OpenGL.