Для работы с Python в Blender существует Python консоль для ввода команд. Данная консоль может быть вызвана с помощью комбинации shift+F4. В данной консоли можно вводить команды в интерактивном и последовательном режиме. После ввода комманды, результат выполнения будет выведен сразу после окончания ввода команды. Примечание: Перед выполнением задания, необходимо знать точный и полный путь до файла с данными. |
Пример программы# Считываем бибилиотеки относящиеся к маетматическим функциям и процедурам import math # Очищаем пространственную сцену от объектов for mesh in bpy.data.meshes: bpy.data.meshes.remove(mesh) # Очищаем пространственную сцену от камер for cam in bpy.data.cameras: bpy.data.cameras.remove(cam) # Sourcing data_file_path = "data/data.txt" # Путь до файла с данными data_array = [] with open(data_file_path) as data_file: # Считываем данные из файла next(data_file) # Пропускаем строку с описанием for line in data_file: data_array.append([float(number) for number in line.split()]) # Filtering # Находим минимум и саксимум финансового показателя fin_data_limits = { "max": max(data_array, key=lambda item: item[0])[0], "min": min(data_array, key=lambda item: item[0])[0], } # Уменьшаем год на 2000, чтобы приблизить к центру координат filtered_data_array = [[item[0], item[1] - 2000, item[2]] for item in data_array] # Mapping # Задаем разделение на 3 уровня цветов divisor = (fin_data_limits["max"] - fin_data_limits["min"]) / 3 box_materials = { "low": bpy.data.materials.new(name="LowBoxMaterial"), "mid": bpy.data.materials.new(name="MidBoxMaterial"), "high": bpy.data.materials.new(name="HighBoxMaterial"), } box_materials["low"].diffuse_color = [0, 1, 0, 1] box_materials["mid"].diffuse_color = [1, 0.7, 0, 1] box_materials["high"].diffuse_color = [1, 0, 0, 1] for point in filtered_data_array: # Создаем параллелепипед bpy.ops.mesh.primitive_cube_add(size=1, location=(point[1]*2, point[2]*2, point[0]/2), scale=(1,1,point[0])) box = bpy.context.object # Задаем цвет box.data.materials.append( box_materials[ "low" if point[0] <= fin_data_limits["min"] + divisor else "high" if point[0] >= fin_data_limits["max"] - divisor else "mid" ] ) # Rendering camera_location = [-26, -6, 20] camera_target = [16, 16, 6] # Задаем ветор для камеры camera_view_vector = [camera_target[i] - camera_location[i] for i in range(3)] # Создаем камеру camera = bpy.data.objects.new("Camera", bpy.data.cameras.new("Camera")) # Помещаем и поварачиваем камеру camera.location = camera_location camera.rotation_euler = Vector(camera_view_vector).to_track_quat('-Z', 'Y').to_euler() # Помещаем камеру на сцену и выбираем её в качестве активной камеры bpy.context.scene.collection.objects.link(camera) bpy.context.scene.camera = camera for area in bpy.context.screen.areas: if area.type == "VIEW_3D": area.spaces.active.region_3d.view_perspective = "CAMERA" break |
Программа вводится и выполняется по частям. |
Часть 1 SourcingВводим текст отвечающий за Sourcing. Большая часть команд в Python не возвращает результатов, видимых в консоли. Если ввести переменную содержащую данные в консоли, то можно увидеть следующее: >>> data_array [[9.959292, 2002.0, 1.0], [9.791727, 2002.0, 2.0], [9.875637, 2002.0, 3.0], [10.09261, 2002.0, 4.0], ... Что означает что данные были успешно считаны из файла |
Часть 2 FilteringЧтобы убедится что Filtering прошел успешно, можно ввести обе новые структуры в консоль и посмотреть на результат: >>> filtered_data_array [[9.959292, 2.0, 1.0], [9.791727, 2.0, 2.0], [9.875637, 2.0, 3.0], [10.09261, 2.0, 4.0],... >>> fin_data_limits {'max': 18.41592, 'min': 7.491813} |
Часть 3 MappingЗапускаем часть отвечаю за Mapping. После создания каждого параллелепипеда, Blender выведет следующее сообщение в консоль: {'FINISHED'} В пространственной сцене Blender можно увидеть созданные параллелепипеды |
Часть 4 RenderingЗапускаем часть отвечаю за Rendering. После задания и активации камеры, мы видим проекционное графическое изображение, полученное с помощью созданной нами камеры. |
Часть 5 BackloopПостольку поскольку камера не захватывает граф целиком, можно увеличить угол обзора камеры с помощью команды camera.data.lens = 35. |
Мы рекомендуем ознакомится с основами Python на официальном сайте, а так же с основами использования Blender библиотек. |