Как я могу согнуть объект в OpenGL?

11

Есть ли способ согнуть объект, например, цилиндр или плоскость, используя OpenGL?

Я новичок в OpenGL (я использую OpenGL ES 2.0, если это имеет значение, хотя я подозреваю, что математика важнее всего в этом случае, так что она как-то не зависит от версии), я понимаю основы: перевод, поворот, матричные преобразования и т. Д. Мне было интересно, есть ли метод, который позволяет вам на самом деле изменить геометрию ваших объектов (в данном случае, согнув их)?

Любые ссылки, учебники или другие ссылки приветствуются!

Валентин Раду
источник

Ответы:

11

Что вам нужно сделать, чтобы «согнуть» объект, это применить некоторую подходящую комбинацию перемещения / поворота / масштабирования только к некоторому подмножеству вершин рассматриваемого объекта - возможно, соответствующим образом взвесив это преобразование.

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

Если все, что вы заинтересованы в очень специфично, разовые деформациях очень простых форм (например, ваша вышеупомянутой плоскость), вы могли бы, вероятно, просто сделать это вручную. Например, решение о «оси изгиба» для вашей плоскости и вычислительных соответствующих преобразований для каждой строки плоских вершин для достижения соответствующего поворота относительно этой оси гибка в зависимости от расстояния от него, а затем применить, что к геометрии (возможно, на CPU, как это было бы самым простым, по крайней мере, на начальном этапе). Но такой метод не очень хорошо масштабируется и было бы очень утомительно.

Так как правильно определить, как взвешивать преобразование для каждой отдельной вершины в наборе для достижения желаемой деформации (особенно для более практичных и сложных объектов), во многих играх используется метод, называемый скелетной анимацией . На высоком уровне это предполагает связать отдельный набор геометрии ( «скелет») с вашей сеткой. Эта геометрия представляет кости вашего объекта, и вы определяете (часто в инструментах моделирования) отображение между вершинами реальной модели и костями скелета - какие кости связаны с каждой вершиной и насколько эта кость влияет на деформацию из этой вершины. Затем скелет анимируется напрямую, и анимация переносится в реальную модель через отношения между костями и их вершинами.

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

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

Смотрите также:

Vaillancourt
источник
9

Для фактической математики коробления, это может получить очень сложно, почему бы вам не начать здесь? ,

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

2 способа:

1) Каждый кадр, посетить каждую вершину в модели цилиндра и смещение его в некотором роде.

2) Смещение вершин в вершинном шейдере , как вы рендеринг. OpenGL ES 2.0 поддерживает вершинные шейдеры. Таким образом , вы находитесь в удаче, в некотором смысле.

Вы хотите только деформировать объект , как он появляется на экране , или вы хотите , чтобы деформировать объект так что каждый объект в игре знает , что она была деформирована?

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

Когда вы деформировать геометрию в вершинных шейдеров исходных вершин модели на самом деле не двигаться , (они только кажутся движущимися ).

Деформация в вершинный шейдер

недеформированной:

не деформируется

Деформированные

деформироваться

Это из главы 6 руководства по cg (программа № 14).

Код шейдера, чтобы произвести эту деформацию что-то вроде

// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;

// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;

// move the vertex
float4 newPosition = position + displacement * displacementDirection ;

// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;

Таким образом, вы можете видеть, это происходит перед тем дисплей (вершинные шейдеры происходят на GPU), поэтому код процессора практически не способ доступа преобразованного положение вершины (есть способы передачи данных с GPU на CPU (в основном через текстуры), но мы не туда).

bobobobo
источник
8

То, что вы пытаетесь достичь, в основном подмножество темы сетки деформации. Но так как ты новичок, я боюсь, что этот тип информации может быть немного слишком странно сейчас. Я постараюсь изложить основные понятия, хотя.

Для этого вам понадобятся две вещи:

  1. Ваша сетка должна иметь достаточно вершин для вас , чтобы преобразовать. Например, если это плоскость, вам нужно убедиться, что она действительно создана как своего рода сетка с множеством вершин для деформации. То же самое с цилиндром. Может быть возможно достичь этого во время выполнения с тесселяцией, но я не знаю много об этом предмете.
  2. Вы должны использовать вершинный шейдер деформировать вершины. В основном вершинные шейдеры заботятся о расчете конечного трансформированного положения каждой вершины, так что вы можете взять шанс применить любые деформации к ним.

Я не уверен, насколько полезным будет, но посмотрите на этот ресурс OpenGL, как это кажется правильным своего рода, что вам нужно:

http://www.ozone3d.net/tutorials/mesh_deformer_p3.php#part_3

Скриншот по этой ссылке:

введите описание изображения здесь

редактировать

Только что увидел ответ Джоша, и я согласен, скелетная анимация - это также очень элегантный способ инкапсулировать эту проблему, особенно когда ваши деформации становятся все более сложными и их сложнее представить математически.

Но помните, что обе приведенные выше точки все же применимы - вы можете деформировать только вершины, поэтому очевидно, что они должны существовать в первую очередь, поэтому ваша сетка должна иметь приличное количество плотности вершин. И обычно это вершинный шейдер, который управляет скелетной анимацией и выполняет смешивание вершин и тому подобное.

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

Дэвид Гувея
источник