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