Самый быстрый способ выполнения вращательных преобразований в цепочке зависимых присоединенных объектов

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

Итак, как локоть, скажем, он может сгибаться только до 45 градусов под определенным углом, и для выполнения поворота я поворачиваю 8 вершин, составляющих объект, вокруг этой невидимой центральной точки шарнира. В процессе 4 общие вершины другого блока несколько смещаются, но поскольку шарнир является центральной точкой среди них, они не «переводятся» от нижнего блока. Я предполагаю, что называть их деревянными нелогично, поскольку они будут трансформироваться определенным образом, но я пытался настроить это так, чтобы визуализировать. Во всяком случае, скажем, я хочу иметь возможность вращать этот нижний блок по-другому, но чтобы верхний блок действовал так, как будто он прикреплен. Таким образом, если нижний блок движется, верхний блок поворачивается вместе с ним, но также с любым изгибом, который он имеет на шарнире между ними.

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


person user173342    schedule 27.01.2012    source источник


Ответы (3)


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

Если это так, то я предлагаю фактически построить несколько «костей», где каждый сегмент кости начинается и заканчивается в центральной точке 4-вершин, составляющих каждую начальную и конечную грань призмы/блоков. Затем вы можете рассчитать, когда вы перемещаете один сегмент цепочки костей, насколько другие кости в цепи должны двигаться относительно кости, которая была перемещена. Оттуда вы можете взвесить остальные вершины в призме/блоке относительно этой центральной «кости», чтобы они перемещались на соответствующую величину при движении кости. Вы также можете усреднить вершины, прикрепленные к одной «кости», по отношению к другому сегменту кости, чтобы вес прикрепленных вершин уменьшался, создавая более плавное движение, если вы в конечном итоге слишком сильно зажимаете в каждой точке. "соединение".

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

person Jason    schedule 27.01.2012
comment
На самом деле речь идет не о распространении движения одного через остальную часть цепочки каким-то естественным образом. Мне просто интересно, есть ли более быстрый способ распространения накопления поворотов шарнира по цепочке зависимостей. Как будто это начинается с поднятия руки в плече, затем ваш локоть согнут на 30 градусов, запястье повернуто на 20 градусов. Есть ли более быстрый способ, чем выполнять вращение угла оси/кватерниона сначала на руке для шарнира запястья, затем на коллективном предплечье/кисти для шарнира локтя, затем на плече/предплечье/кисти для плеча? - person user173342; 27.01.2012
comment
Прямая кинематика (то, что вы описываете, где вы сначала преобразуете дочерний элемент, а затем родительский) будет самым быстрым способом, так что нет, там нет ничего более быстрого. Однако особенность использования системы костей заключается в том, что вам не нужно применять каждое преобразование к каждой вершине. Кости — единственные, к которым применяются сложные матрицы вращения, а вершины просто интерполируются из нового местоположения костей. - person Jason; 27.01.2012
comment
Ах, хорошо, я представлял вещи в виде костей, как вы описываете, за исключением первоначального создания вершин. Тогда это должно сработать, спасибо! - person user173342; 27.01.2012

Рассмотрите возможность использования существующего инструмента. Взгляните на этот вопрос о связывании твердых тел:

https://physics.stackexchange.com/questions/19724/how-to-represent-the-effect-of-linking-rigid-bodies-together

person Johan Lundberg    schedule 27.01.2012

Стандартный способ работы с сочлененной односторонней цепочкой – это скелетная анимация – использование цепочки элементы «кости» (определяемые относительным отношением перемещения/вращения) с возможностью выполнения линейной интерполяции на основе костей для определения положения вершин «кожи». (Обратите внимание, что вам нужно будет определить угол поворота каждого «сочленения», чтобы полностью определить позу.)

С кольцом элементов работать сложнее, потому что вы больше не можете определять вращение каждого сустава независимо от всех остальных. Чтобы решить эту проблему, настройте физическое моделирование или другой решатель, который включает все ограничения. Что именно делать, зависит от того, как вам нужно манипулировать объектом — если он является частью игрового движка, физическая симуляция имеет смысл, но если его нужно анимировать вручную, у вас есть широкий спектр возможностей для полуавтоматического риггинга ( ключевое слово: реверсивная кинематика).

person comingstorm    schedule 27.01.2012