59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
"""Blender --background --python tools/create_character.py (does not need UE)."""
|
|
from pathlib import Path
|
|
|
|
import bpy
|
|
|
|
root = Path(__file__).resolve().parents[1]
|
|
target = root / "source_assets/character/character.blend"
|
|
if target.exists():
|
|
raise RuntimeError(f"Plik juz istnieje: {target}. Generator nie nadpisuje Twojego modelu.")
|
|
bpy.ops.object.select_all(action="SELECT")
|
|
bpy.ops.object.delete(use_global=False)
|
|
collection = bpy.data.collections.new("Character")
|
|
bpy.context.scene.collection.children.link(collection)
|
|
|
|
|
|
def material(name, color):
|
|
mat = bpy.data.materials.new(name)
|
|
mat.use_nodes = True
|
|
bsdf = mat.node_tree.nodes.get("Principled BSDF")
|
|
bsdf.inputs["Base Color"].default_value = (*color, 1)
|
|
bsdf.inputs["Roughness"].default_value = 0.5
|
|
mat.diffuse_color = (*color, 1)
|
|
return mat
|
|
|
|
|
|
blue = material("Body_Blue", (0.03, 0.3, 0.8))
|
|
orange = material("Head_Orange", (0.9, 0.22, 0.04))
|
|
dark = material("Eyes", (0.01, 0.01, 0.015))
|
|
|
|
|
|
def part(name, position, scale, mat, sphere=False):
|
|
if sphere:
|
|
bpy.ops.mesh.primitive_uv_sphere_add(segments=24, ring_count=16, radius=0.5, location=position)
|
|
else:
|
|
bpy.ops.mesh.primitive_cube_add(size=1, location=position)
|
|
obj = bpy.context.object
|
|
obj.name = name
|
|
obj.scale = scale
|
|
for owner in list(obj.users_collection):
|
|
owner.objects.unlink(obj)
|
|
collection.objects.link(obj)
|
|
obj.data.materials.append(mat)
|
|
if sphere:
|
|
for polygon in obj.data.polygons:
|
|
polygon.use_smooth = True
|
|
return obj
|
|
|
|
|
|
part("Body", (0, 0, 0.9), (0.55, 0.8, 0.9), blue)
|
|
part("Head", (0, 0, 1.75), (0.7, 0.7, 0.7), orange, True)
|
|
part("LeftLeg", (0, -0.23, 0.25), (0.35, 0.3, 0.5), blue)
|
|
part("RightLeg", (0, 0.23, 0.25), (0.35, 0.3, 0.5), blue)
|
|
part("Eye_L", (0.31, -0.14, 1.82), (0.12, 0.12, 0.12), dark, True)
|
|
part("Eye_R", (0.31, 0.14, 1.82), (0.12, 0.12, 0.12), dark, True)
|
|
bpy.context.scene.unit_settings.system = "METRIC"
|
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
bpy.ops.wm.save_as_mainfile(filepath=str(target))
|
|
print("Gotowy model: " + str(target))
|