понедельник, 10 октября 2016 г.

Код оператора будущего аддона.

    Разобрался с выбором объекта и с прочими появившимися проблемами. Что еще надо сделать:
a) Добавить модификатор Solidify, и соответственно применение его.
b) Оформить некоторые переменные как Property
c) Написать первую версию Гуя, и разместить его в DATA

    Выпотрошил пример Simple Operator из примеров блендера и заменил функционал. Замучился я с применением модификатора взрыва, никак не хотел он нормально применяться, пришлось каждый раз пересчитывать его данные, как итог, результат не похож на настроенный оригинал. Все остальное позже доделаю, а пока можно почитать, да и потестить ( с подсветкой синтаксиса и комментариями!):


пятница, 7 октября 2016 г.

Что-то я делаю не так.

    Пытаюсь написать оператор блендера на основе скрипта из предыдущего сообщения. Казалось бы, код вполне себе работоспособный, бери и пользуйся. Голосом М. Задорнова: "Конечно!". То не могу активный объект переназначить, теперь модификатор взрыва выеживается. Применяется совсем не так, как ручками. Совсем другая логика, ни разу не BGE. Где бы что на русском языке почитать, для достижения просветления, не век же мне в позе лотоса медитировать созерцая строки кода? Бубен купить что ли?

среда, 5 октября 2016 г.

Пишу аддон взрыва объекта.

   Будем считать, что пока еще версия 0.1 Авось хватит времени его дописать, но пока не сделал, буду периодически выкладывать сюда код. Собственно базовый функционал уже готов, при запуске скрипта, при наличии выбранного объекта, рядом с ним генерируется объект, отвечающий за демонстрацию взрыва. На нем генерируется куча ключей форм, значения которых анимируется. Вот эту анимацию и надо запускать в BGE, не забывая конечно, что анимацию нужно применять именно на этом свежесозданном объекте. Код и немного подробностей ниже, извините что мало и код без подсветки синтаксиса, но всё еще будет переписываться, поэтому ИЗВИНИТЕ.


суббота, 30 июля 2016 г.

Проверил одну мысль...

    В связи с сильными дождями появилась свободная минутка и я решил проверить одну мысль: что если генерировать Stencil - маску "на лету"? Таки получилось. Что это дает?


суббота, 9 июля 2016 г.

Вершины в словаре.

    Время доступа по ключу к записанному в словаре значению величина постоянная и не зависит от размера словаря. Казалось бы, что сразу не сообразить, закидывать в словарь всякое разное? А вот поди же... Сообразил, что если вершины меша записать в словарь, то для изменения каких-то характеристик конкретной вершины не надо перебирать их всех циклом, а просто вызвать по ключу.
   Ключи в словарях это нечто невероятно удобное. Достаточно сказать, что они могут быть разных типов. Как вам понравится идея использования в качестве ключа например числа типа float? Или экземпляр собственноручно написанного класса? А ведь можно. Потому что всё есть объект.
    Вот, сообразив всё вышеописанное, соорудил даже не пример, нет, это скорее альфа - прототип ландшафта, в котором рельеф задается изменением z-координаты вершин меша. Оно еще весьма корявое, но если кому интересно:

SculptLand.blend.7z (108 kB)

вторник, 12 апреля 2016 г.

воскресенье, 10 апреля 2016 г.

Хорошо, когда некогда возиться...

   По причине недостатка времени пришлось залезть в модуль bpy для ускорения работы - ну вот не могу я три десятка блоков клонировать три раза, каждый раз смещая и поворачивая клон на 90 градусов, да еще применяя поворот. А надо ведь еще переименовать каждый блок, чтобы имя объекта совпадало с именем меша, да еще добавить каждому блоку игровое проперти с определенным значением - ручками будет нудно и долго. Проперти надо добавлять, потому что у меня редактор должен использовать bge, а проперти будет служить указанием типа, для сборки в список имен блоков одного типа. Я еще не решил как оно лучше будет сделать. И наверное, надо выстроить блоки в линию.
    Запишу, читателям может пригодится, мне как страховка от склероза.

*****
Клонировать и покрутить:

import bpy
# получаем выделенный объект
object = bpy.context.object
# дублируем
bpy.ops.object.duplicate()
# поскольку после дублирования выделенным становится клон, то переполучаем
# выделенный объект.
object = bpy.context.object
# двигаем, тут понятно и так
object.location[1] = object.location[1] - 4.0
# вращаем, угол задается в радианах
bpy.ops.transform.rotate(value = 1.5708, axis = (0.0, 0.0, 1.0))
# применяем вращение
bpy.ops.object.transform_apply(rotation = True)

*****
Создать новое проперти и изменить его значение:

import bpy
# получаем выделенный объект
object = bpy.context.object
# создаем новое проперти типа STRING
bpy.ops.object.game_property_new(type = 'STRING', name = 'TYPE')
# получаем к новому проперти доступ по имени и изменяем значение
object.game.properties.get('TYPE').value = 'bla-bla'

*****
Переименовать объект и меш:

import bpy
# получаем выделенный объект
object = bpy.context.object
# Переименовываем сам объект блока
object.name = 'NEW_NAME'
# Переименовываем меш блока
object.data.name = 'NEW_NAME'