Самый быстрый способ выполнения вращательных преобразований в цепочке зависимых, прикрепленных объектов - PullRequest
2 голосов
/ 27 января 2012

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

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

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

Ответы [ 3 ]

0 голосов
/ 27 января 2012

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

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

0 голосов
/ 27 января 2012

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

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

0 голосов
/ 27 января 2012

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

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

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

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