Когда я писал прошлую, статью, ко мне в голову пришла одна гениальная мысль. Которую я почти сразу оформил в виде скрипта на Python. Данный скрипт выводит мне координаты вращения в углах Эйлера, местоположение объекта, данные о его масштабировании и соответственно сами координаты. Теперь вспомним намеченный план из прошлой статьи:
- Получить информацию об углах поворота объекта
- С учетом углов поворота, изменить координаты точек
- Получить информацию о масштабе, данной фигуры
- С учетом масштаба, увеличить/уменьшить координаты.
- Получить данные о положении объекта
- Все полученные на предыдущих шагах координаты переместить в место их реального положения (слава богу все координаты объекта изначально указаны относительно, геометрического, а может и просто программного центра фигуры, главное, что центра!)
Т.е. пункты 1, 3 и 5 выполнены. Необходимо приступить к пункту 2. С учетом углов поворота, изменить координаты точек.
Напишем алгоритм преобразования:
- Определить под каким углом расположен вектор из начала координат (в нашем случае он совпадает с центром фигуры) до вершины.
- Вычислить длину, этого вектора с учетом заданного поворота.
- Прибавить угол вращения
- Вычислить новые координаты.
Главное не забывать, что в программировании также, как в механике используется радианная мера углов.
Рассмотрим преобразования для оси X, для этого потребуется рисунок:
Зеленая стрелка это ось Y, синяя стрелка ось Z.
- Соответственно для оси X длина вектора от начала координат, до точки равна: modul = sqrt(Y^2+Z^2).
- Угол поворота определяем с помощью функции phiX = atan2(Z,Y).
- Далее к phiX прибавляем нужный угол поворота. phiX = phiX + angelX.
- Вычисляем новые координаты newY = modul*cos(phiX); newZ = modul*sin(phiX);
Теперь рассмотрим преобразования для оси Y:
Красная стрелка это ось X, синяя стрелка ось Z.
- Соответственно для оси Y длина вектора от начала координат, до точки равна: modul = sqrt(X^2+Z^2).
- Угол поворота определяем с помощью функции phiY = atan2(X,Z).
- Далее к phiX прибавляем нужный угол поворота. phiY = phiY + angelY.
- Вычисляем новые координаты newX = modul*sin(phiY); newZ = modul*cos(phiY);
Ну и остался угол для последней оси Z:
Зеленая стрелка ось Y, красная ось X
- Соответственно для оси Z длина вектора от начала координат, до точки равна: modul = sqrt(X^2+Y^2).
- Угол поворота определяем с помощью функции phiZ = atan2(Y,X).
- Далее к phiX прибавляем нужный угол поворота. phiZ = phiZ + angelZ.
- Вычисляем новые координаты newX = modul*cos(phiZ); newY = modul*sin(phiZ);
Теперь дело за проверкой, ведь согласитесь, я мог и ошибиться в понимании углов Эйлера.
Программу протестировал в самом Blender'е скрипт оказался вполне исправно работающим и как итог мое понимание оказалось верным. То как я тестировал скрипт описывать не буду. Скрипт тестировал отдельно для каждой оси.
Теперь пора перейти к шагу 4. С учетом масштаба, увеличить/уменьшить координаты.
Здесь все просто.
- x = x*scaleX
- y = y*scaleY
- z = z*scaleZ
Ну и как итог, последний шаг все полученные на предыдущих шагах координаты переместить в место их реального положения:
- x = x + locationX
- y = y + locationY
- z = z + locationZ
Ну вот и все, скрипт, который правильно выводит координаты для фигур написан. Следующая задача, написать скрипт, который все эти координаты преобразует в G/M коды, пускай даже по началу без особых оптимизаций (в конце концов я только учусь). Но это уже в следующем посте.
Комментариев нет:
Отправить комментарий