... а если сразу рисовать во вьюпорте bgl ...напримерhttp://blender.stackexchange.com/questions/61699/how-to-draw-geometry-in-3d-view-window-with-bgl?rq=1http://hhttp://blender-3d.ru/forum/Smileys/default/wink.gifttps://svn.blender.org/svnroot/bf-extensions/trunk/py/scripts/addons/space_view3d_screencast_keys.py
... мне думается, что ксилофон уже должен содержать полный набор действий (action) и задача только их расставить во времени ...
class AnimFromOtherKeys(bpy.types.Operator): bl_idname = "anim.create_from_other_keys" bl_label = "Create" bl_description = "" bl_options = {'REGISTER', 'UNDO'} def execute(self, context): scene = context.scene ob = bpy.data.objects["Synth Brazz 1"] keys = [] for fcurve in ob.animation_data.action.fcurves: fcurve_keys = [fcurve.data_path] len_points = len(fcurve.keyframe_points) for i in range(0,len_points,4): k0 = fcurve.keyframe_points[i].co[:] k1 = fcurve.keyframe_points[i+1].co[:] k2 = fcurve.keyframe_points[i+2].co[:] k3 = fcurve.keyframe_points[i+3].co[:] note = '' for symbol in fcurve.data_path: if symbol.isdigit(): note+=symbol keys.append((note,k0,k1,k2,k3)) frames = [] for key in keys: frames.append(key[1][0]) frames.sort() hands = ['Left','Right'] for frame in frames: for key in keys: if key[1][0] == frame: bpy.ops.object.select_all(action='DESELECT') ob_anim = bpy.data.objects[hands[0]] ob_anim.select = True scene.frame_set(frame) ..................... hands.reverse() return {'FINISHED'}
... так тоже пытаюсь ...
>> я пытаюсь брать данные из твоим кодом созданного объекта... упс, сам то уже выкинул этот код и объекты в топку, новая тема ...... суть - не управлять кривыми, а рулить уже готовыми действиями инструмента ...... то есть настройка должным образом инструмента это отдельная задача, её нужно решать в рамках подготовки инструмента (ксилофон, саксофон, миелафон, ...) ...>> уже отдохнуть башке нужно... попробуй запустить шмеля {ALT+A}...https://yadi.sk/d/RQpSw8o3z5Qno
>> Ты свой код зря выбросил... конечно же код в копилке, но ...... но в последней варианте уровень абстракции выше ...... есть файлы с данными (mmp,midi,xml) в которых упакована информация о старте и продолжительности действия ...... есть 3d модель с анимацией и своим набором действий ...... нужно связать действия из файла с действиями из анимации ...
class MusicPatternSettings(bpy.types.PropertyGroup): @classmethod def register(cls): bpy.types.TextCurve.music_pattern = PointerProperty( name="Music Pattern Settings", description="", type=cls, ) auto = BoolProperty() musician = StringProperty() instrument = StringProperty() @classmethod def unregister(cls): del bpy.types.TextCurve.music_pattern
if ob and ob.type == 'FONT' and len(ob.data.notes) > 0: layout = self.layout+ layout.prop_search(ob,"musician",context.blend_data,'objects',text='Musician')+ layout.prop_search(ob,"instrument",context.blend_data,'objects',text='Instrument')+ layout.prop(ob,"auto") ctx = ob.data.notes[note]
на текущий момент моё видение такое:А) на стороне чтеца1) загрузка данных в "универсальную" структуру мета-действий2) сохранение "универсальной" структуры в .blend моделиБ) на стороне жнеца1) чтение "универсальной" структуры мета-действий2) преобразование мета-действий в "соответствии" с "согласованным" профилем выбранного инструмента в действияВ) на стороне кузнеца1) моделирование инструмента2) моделирование арматурной оснасти3) описание "согласованного" профиляинструмент - это 3d модель (любая модель или группа моделей с прописанными действиями)согласованный профиль - таблица трансляции мета-действий в действияуниверсальная структура - это блок памяти для хранения информации, прочитанной из различных форматов файлов - {код действия, время начала, продолжительность, сила}твой код служит оснасткой для кузнеца для подготовки инструментаопять же инструмент , это уже не просто (ксилофон, саксофон, миелафон, ...), а (ксилофон, саксофон, миелафон, ...) + исполнитель (если таковой предусмотрен сценой) ...
notes = { "48": ["До_4","c4","C4"] # start "49": ["До_диез_4","Ре_бемоль_4","cis4","des4","C-sharp4","D-flat4"] "50": ["Ре_4","d4","D4"] "51": ["Ре_диез_4","Ми_бемоль_4","dis4","es4","D-sharp4","E-flat4"] "52": ["Ми_4","e4","E4"] "53": ["Фа_4","f4","F4"] "54": ["Фа_диез_4","Соль_бемоль_4","fis4","ges4","F-sharp4","G-flat4"] "55": ["Соль_4","g4","G4"] "56": ["Соль_диез_4","Ля_бемоль_4","gis4","as4","G-sharp4","A-flat4"] "57": ["Ля_4","a4","A4"] "58": ["Ля_диез_4","Си_бемоль_4","ais4","b4","A-sharp4","B-flat4"] "59": ["Си_4","h4","B4"]}
if key == "49": for ob in bpy.data.objects: if ob.name in notes["49"]: obj = ob else: obj = bpy.data.objects.new(name = notes["49"][-1])