Будем считать, что пока еще версия 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()
Во-первых, для использования скрипта нужно настроить на нем систему частиц и модификатор взрыва. Убедиться, что объект выбран и запустить скрипт.
Во-вторых, текст скрипта:
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, очень непривычно.
Комментариев нет:
Отправить комментарий