Как повернуть группу 2D фигур вокруг произвольной точки - PullRequest
2 голосов
/ 11 июля 2011

и я делаю класс 'Body', который объединяет кучу 2D-фигур, образуя одно подвижное, вращающееся тело.

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

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

Как я могу это сделать?

Ответы [ 3 ]

10 голосов
/ 11 июля 2011

Способ поворота на произвольную точку состоит в том, чтобы сначала вычесть координаты точки, выполнить вращение вокруг начала координат, а затем добавить координаты точки.

x2 = px + (x1-px)*cos(q)-(y1-py)*sin(q)
y2 = py + (x1-px)*sin(q)+(y1-py)*cos(q)

, где px, py - координаты точки вращения,и x1,y1 исходная вершина 2D-формы, x2,y2 повернутые координаты и q угол в радианах.

1 голос
/ 11 июля 2011

Я предполагаю, что вы представляете точки в декартовых координатах (x, y), и что вас устраивает базовая идея векторов.

Чтобы повернуть одну точку на заданный угол θ вокругначало координат (0,0), мы преобразуем его следующим образом:

x '= x cos (θ) - y sin (θ)
y' = x sin (θ) + y cos (θ)

Или в виде векторной матрицы:

X ' = M (θ) X

(Я могу разобрать материал векторной матрицы, если вы с ним не знакомы.)

Чтобы повернуть точку X вокруг точки B ,сделать это:

X ' = B + M (θ) ( X - B )

Чтобы повернуть все тело на θ вокруг его центра B , просто поверните центр каждой фигуры на θ примерно на B и поверните каждую фигуру вокруг своей собственнойпо центру θ (эти шаги можно выполнять в любом порядке).

0 голосов
/ 11 июля 2011

Что вам нужно, так это иерархия преобразований. По сути, то, что делается все время в 3D, только вы используете 2D математику для этого. Таким образом, вместо аффинных матриц 4x4 у вас есть аффинные матрицы 3x3.

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

Вам нужна иерархия объектов: дерево. Ваше «тело» - это узел в дереве. У него есть дочерние узлы: две верхние ноги, две верхние руки и голова. Каждая верхняя нога имеет нижнюю ногу как ребенок, так же как каждая верхняя рука имеет нижнюю руку как ребенок. И так далее.

Итак, когда приходит время рисовать все, вы накапливаете матрицы. Вы получаете матрицу преобразования тела, трансформируете тело им и визуализируете ее. Затем вы получаете каждого потомка тела, умножаете его преобразование на его родителя, трансформируете эту форму в эту новую матрицу и визуализируете ее. Затем для каждого из них вы повторяете процесс: берете родительскую матрицу, применяете ее локальную матрицу к этой родительской матрице, трансформируете объект с помощью новой матрицы и визуализируете ее. Повторяйте всю иерархию объектов.

Действительно, лучший способ понять это - посмотреть, как это делают 3D-рендеры. 2D-рендеринг - это особый случай, когда вы вращаетесь только вокруг Z и имеете только 2D-перевод.

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