|
|
Для работы с 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 библиотек. |