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

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

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




 Во-первых, для использования скрипта нужно настроить на нем систему частиц и модификатор взрыва. Убедиться, что объект выбран и запустить скрипт.
Во-вторых, текст скрипта:

import bpy

def cloneMoveAndRename(object, name, index):

    status = bpy.ops.object.duplicate()
    obj = bpy.context.scene.objects.active
    obj.location[1] = obj.location[1] + (obj.dimensions[1] * index)
    obj.name = name + '_Explode_' + str(index)
    obj.data.name = name + '_Explode_' + str(index)
    print('cMAR', object.name)
    bpy.context.scene.frame_current = index
    bpy.ops.object.modifier_apply(modifier = 'Explode')
    bpy.ops.object.particle_system_remove()
    object.select = True
    bpy.ops.object.select_all(action = 'DESELECT')
   
    return obj.name
   
def objectToShape(objectExpl, listNames):

    for num in range(1, len(listNames)):
        currObj = bpy.context.scene.objects[listNames[num]]
        objectExpl.select = True
        bpy.context.scene.objects.active = objectExpl
        currObj.select = True
        bpy.ops.object.join_shapes()
        bpy.ops.object.select_all(action = 'DESELECT')
       
        currObj.select = True
        bpy.ops.object.delete()

def insertKeyToShape(shapeKeys, diff):

    for block in shapeKeys.key_blocks:
        if block.name == 'Basis':
            continue
        else:
            fr = int(block.name.split('_')[-1])
            frameList = [(0.0, fr-diff), (1.0, fr), (0.0, fr+diff)]
            for J in frameList:
                block.value = J[0]
                block.keyframe_insert("value", frame = J[1])  
 
   
def main():
    print('<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>')
    scene = bpy.context.scene
    object = bpy.context.object
    name = object.name
    listNames = []

    for i in range(1, 50):
        bpy.context.scene.frame_current = 0
        object.select = True
        bpy.context.scene.objects.active = object
         
        newName = cloneMoveAndRename(object, name, i)
        listNames.append(newName)
       
    #print(listNames, len(listNames))
    objectExpl = bpy.context.scene.objects[listNames[0]]
   
    objectToShape(objectExpl, listNames)
           
    objectExpl.select = True
    bpy.context.scene.objects.active = objectExpl
    shapeKeys = objectExpl.data.shape_keys
    insertKeyToShape(shapeKeys, 1)      
   
    bpy.context.scene.frame_current = 0
 
if __name__ == '__main__':
    main()

Сам по себе аддон всего лишь автоматизация способа получения взрыва, предложенного Mihanik на форуме b3d.org.ua. Хотя до требуемого уровня его еще пилить и пилить. Нужно еще сделать, что бы меши не генерировались на каждый фрейм, а скажем раз в пять фреймов, сделать куда-то менюшку, наверное в DATA всуну, или в T-панель. Нужно добавить модификатор Solidify, чтобы толщина у разлетающихся кусков была, и наверное сунуть еще шейдер эрозии, для неровности краев.  Как оно пойдет без понятия, потому что логика работы с bpy сильно отличается от таковой с bge, очень непривычно.


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

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