воскресенье, 8 апреля 2012 г.

Изучение Blender API Часть 2

Когда я писал прошлую, статью, ко мне в голову пришла одна гениальная мысль. Которую я почти сразу оформил в виде скрипта на Python. Данный скрипт выводит мне координаты вращения в углах Эйлера, местоположение объекта, данные о его масштабировании и соответственно сами координаты. Теперь вспомним намеченный план из прошлой статьи:

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

  1. x = x*scaleX
  2. y = y*scaleY
  3. z = z*scaleZ
Ну и как итог, последний шаг все полученные на предыдущих шагах координаты переместить в место их реального положения:
  1. x = x + locationX
  2. y = y + locationY
  3. z = z + locationZ
Ну вот и все, скрипт, который правильно выводит координаты для фигур написан. Следующая задача, написать скрипт, который все эти координаты преобразует в G/M коды, пускай даже по началу без особых оптимизаций (в конце концов я только учусь). Но это уже в следующем посте.

Комментариев нет:

Отправить комментарий