понедельник, 2 апреля 2012 г.

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

Введение

В предыдущем сообщении, я поставил перед собой цели. Одной из которых является изучение Blender API, чтобы вывести координаты каждой точки 3D модели во внешний текстовый файл.
В своем изучении Blender API я не соблюдал никаких последовательностей, возможно в этом моя ошибка. В этой теме хочу по пунктам изучить Blender API.
Начнем с нуля, или как на официальном сайте Blender осуществим быстрый старт.
Blender/Python API позволяет:
  • Редактировать любые данные пользовательского интерфейса
  • Изменять настройки пользователя, раскладки и темы
  • Запускать инструменты со своими настройками
  • Создавать элементы пользовательского интерфейса, такие как меню, заголовки и панели.
  • Создавать новые инструменты
  • Создавать интерактивные инструменты
  • Создавать новые движки для рендеринга, которые будут совместимы с Blender
  • Создавать новые настройки для имеющихся в Blender данных
  • Рисовать 3D изображения используя команды OpenGL

Ключевые концепции

Перед началом любых действий лучше сразу импортировать библиотек Blender API с помощью команды:
>>> import bpy

Доступ к данным

Доступ к данным, может быть получен, прямо из консоли Python. Данная операция осуществляется с помощью модуля bpy.data. Он дает доступ к библиотеке данных. Рассмотрим пример:
>>> bpy.data.objects
<bpy_collection[3], BlendDataObjects>

>>> bpy.data.scenes
<bpy_collection[1], BlendDataScenes>

>>> bpy.data.materials
<bpy_collection[1], BlendDataMaterials>

О коллекциях

Вы наверняка заметили, что индекс, также как в строке, может быть использован для доступа к членам коллекции.
Для доступа к членам коллекции используется два метода, но надо учитывать, что индекс может быть изменен при очередном запуске Blender.
>>> list(bpy.data.objects)
[bpy.data.objects["Camera"], bpy.data.objects["Cube"], bpy.data.objects["Lamp"]]

>>> bpy.data.objects['Cube']
bpy.data.objects["Cube"]

>>> bpy.data.objects[1]
bpy.data.objects["Cube"]

Доступ к аттрибутам

Создав блоки данных, такие как материалы, объекты, группы и др. необходимо изменить их свойства, используя интерфейс пользователя. Эти же возможности доступны и с помощью Blender API.
>>> bpy.data.objects[0].name'Camera'

>>> bpy.data.scenes["Scene"]
bpy.data.scenes["Scene"]

>>> bpy.data.materials.new("MyMaterial")
bpy.data.materials["MyMaterial"]
Для проверки, что данные доступны, и могут использоваться из консоли воспользуемся следующим примером:
>>> bpy.data.scenes[0].render.resolution_percentage
50

>>> bpy.data.scenes[0].objects["Cube"].data.vertices[0].co.x
1.0
Казалось, бы вот он ответ, на мучающий меня вопрос, но увы не тут то было. Координаты, которые получаем при выводе таким методом, скажем так, весьма относительны. Почему? Потому, что те координаты, что он дает, это координаты при условии, что моделька, один к одному, да и при всем при этом не масштабирована, не повернута, в разных направлениях и ее центр совпадает с центром начала координат.
Как с этим бороться?
  1. Получить информацию об углах поворота объекта
  2. С учетом углов поворота, изменить координаты точек
  3. Получить информацию о масштабе, данной фигуры
  4. С учетом масштаба, увеличить/уменьшить координаты.
  5. Получить данные о положении объекта
  6. Все полученные на предыдущих шагах координаты переместить в место их реального положения (слава богу все координаты объекта изначально указаны относительно, геометрического, а может и просто программного центра фигуры, главное, что центра!)
Из этого алгоритма, на данный момент, я не знаю, как выполнить первый пункт (получение углов вращения). Остальные пункты, по крайней мере все, что связано с Blender'ом я могу выполнить, а то что с ним не связано, могу вывести и написать алгоритм.
Главное, что я верю, что это реально сделать! И пускай и не сразу, но я сделаю это, ибо у меня есть, тайный стимул, но об этом я расскажу позже.

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

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