Anonymous
Скрипт Blender Python не позиционирует сетки прямо из изображения.
Сообщение
Anonymous » 04 янв 2025, 14:30
Я пытаюсь использовать Blender для создания сеток областей из изображения BMP, что-то похожее на то, как Hearts of Iron IV обрабатывает провинции, но в Blender. Однако положение и размеры областей в изображении BMP не совпадают напрямую с выходными данными в Blender.
Ниже приведен сценарий, который я использую
Код: Выделить всё
import bpy
import csv
import numpy as np
from mathutils import Vector
IMAGE_FILE_PATH = r"path/to/Map.bmp"
CSV_FILE_PATH = r"path/to/Map.csv"
LIMIT = 10
def parse_csv(file_path):
color_to_province = {}
with open(file_path, "r") as file:
reader = csv.reader(file, delimiter=";")
for row in reader:
province_id = int(row[0])
rgb_color = (int(row[1]), int(row[2]), int(row[3]))
color_to_province[rgb_color] = province_id
return color_to_province
def load_image_as_array(image_file_path):
from bpy_extras.image_utils import load_image
image = load_image(image_file_path)
pixels = np.array(image.pixels).reshape(image.size[1], image.size[0], 4)
return (pixels[:, :, :3] * 255).astype(int), image.size
def create_provinces(image_file_path, csv_file_path, limit):
pixel_data, (width, height) = load_image_as_array(image_file_path)
color_to_province = parse_csv(csv_file_path)
processed_provinces = 0
for color, province_id in color_to_province.items():
if processed_provinces >= limit:
break
mask = np.all(pixel_data == color, axis=2)
coords = np.argwhere(mask)
if coords.size == 0:
continue
vertices = [Vector((x, -y, 0)) for y, x in coords]
mesh = bpy.data.meshes.new(f"Province_{province_id}")
obj = bpy.data.objects.new(f"Province_{province_id}", mesh)
bpy.context.collection.objects.link(obj)
mesh.from_pydata(vertices, [], [])
mesh.update()
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.select_all(action="SELECT")
bpy.ops.mesh.convex_hull()
bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.modifier_add(type="DECIMATE")
obj.modifiers["Decimate"].ratio = 1
bpy.ops.object.modifier_apply(modifier="Decimate")
bpy.ops.object.shade_smooth()
processed_provinces += 1
create_provinces(IMAGE_FILE_PATH, CSV_FILE_PATH, LIMIT)`
Я пытаюсь заставить Blender генерировать сетки для областей, представленных в файле BMP, используя файл CSV для сопоставления цветов с конкретными провинциями.
Подробнее здесь:
https://stackoverflow.com/questions/793 ... -the-image
1735990221
Anonymous
Я пытаюсь использовать Blender для создания сеток областей из изображения BMP, что-то похожее на то, как Hearts of Iron IV обрабатывает провинции, но в Blender. Однако положение и размеры областей в изображении BMP не совпадают напрямую с выходными данными в Blender. Ниже приведен сценарий, который я использую [code] import bpy import csv import numpy as np from mathutils import Vector IMAGE_FILE_PATH = r"path/to/Map.bmp" CSV_FILE_PATH = r"path/to/Map.csv" LIMIT = 10 def parse_csv(file_path): color_to_province = {} with open(file_path, "r") as file: reader = csv.reader(file, delimiter=";") for row in reader: province_id = int(row[0]) rgb_color = (int(row[1]), int(row[2]), int(row[3])) color_to_province[rgb_color] = province_id return color_to_province def load_image_as_array(image_file_path): from bpy_extras.image_utils import load_image image = load_image(image_file_path) pixels = np.array(image.pixels).reshape(image.size[1], image.size[0], 4) return (pixels[:, :, :3] * 255).astype(int), image.size def create_provinces(image_file_path, csv_file_path, limit): pixel_data, (width, height) = load_image_as_array(image_file_path) color_to_province = parse_csv(csv_file_path) processed_provinces = 0 for color, province_id in color_to_province.items(): if processed_provinces >= limit: break mask = np.all(pixel_data == color, axis=2) coords = np.argwhere(mask) if coords.size == 0: continue vertices = [Vector((x, -y, 0)) for y, x in coords] mesh = bpy.data.meshes.new(f"Province_{province_id}") obj = bpy.data.objects.new(f"Province_{province_id}", mesh) bpy.context.collection.objects.link(obj) mesh.from_pydata(vertices, [], []) mesh.update() bpy.context.view_layer.objects.active = obj bpy.ops.object.mode_set(mode="EDIT") bpy.ops.mesh.select_all(action="SELECT") bpy.ops.mesh.convex_hull() bpy.ops.object.mode_set(mode="OBJECT") bpy.ops.object.modifier_add(type="DECIMATE") obj.modifiers["Decimate"].ratio = 1 bpy.ops.object.modifier_apply(modifier="Decimate") bpy.ops.object.shade_smooth() processed_provinces += 1 create_provinces(IMAGE_FILE_PATH, CSV_FILE_PATH, LIMIT)` [/code] Я пытаюсь заставить Blender генерировать сетки для областей, представленных в файле BMP, используя файл CSV для сопоставления цветов с конкретными провинциями. Подробнее здесь: [url]https://stackoverflow.com/questions/79328758/blender-python-script-isnt-positioning-meshes-right-from-the-image[/url]