본문 바로가기
Graphics/Blender 3D

블랜더 기초석 모델링(건물의 기둥고정용) python 코드

by Coding Life 2025. 4. 13.

만들고자 하는 형태를 기술함.

블랜더에서 python을 이용해서 객체를 만들수 있다.

아래의 내용을 그리는 파이썬 코드가 필요하다.

`````
건물의 기초석에 해당되는 돌을 그릴거야. 사각형 기둥형태인데, 하부에서 상부로 올라갈수도 좁아지는 형태의 시멘트를 부을 거푸집과 그 안에 들어가서 굳을 돌을 만들거야.

정사각형의 형태의 하부에서 위로 올라갈수로 점점 작아지는 형태인데,
기둥을 고정하는 용도의 물건이다.

가로250mm x 세로250mm 그리고 높이는 300mm 형태가 된다.

 

아래는 Blender에서 **기초석(사각형 기둥 형태, 위로 올라갈수록 좁아지는 형태)**을 Python으로 생성하는 스크립트입니다. 이 코드는 Blender의 bpy 모듈을 사용하여 **거푸집(외형)**과 **속의 돌(콘크리트 덩어리)**을 모델링합니다.


✅ 전제

  • 하부는 250mm x 250mm, 상부는 200mm x 200mm 정도로 점점 좁아지는 형태로 설정
  • 높이는 300mm
  • 거푸집과 속의 돌을 각각 다른 객체로 생성
  • 단위는 Blender 기본 단위(m), 따라서 mm → m 변환 필요 (1m = 1000mm)

🧱 Blender Python 스크립트

import bpy
import bmesh
from mathutils import Vector

# mm to m 변환
def mm(val):
    return val / 1000

# 기존 객체 제거
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

# 기초석 기본 값
bottom_size = mm(250)
top_size = mm(200)
height = mm(300)

def create_tapered_cube(name, bottom_size, top_size, height, offset_z=0, material_name=None):
    mesh = bpy.data.meshes.new(name + "_mesh")
    obj = bpy.data.objects.new(name, mesh)

    bpy.context.collection.objects.link(obj)
    bpy.context.view_layer.objects.active = obj

    bm = bmesh.new()

    # 하부 정사각형
    b = bottom_size / 2
    t = top_size / 2

    bottom = [
        Vector((-b, -b, 0)),
        Vector(( b, -b, 0)),
        Vector(( b,  b, 0)),
        Vector((-b,  b, 0)),
    ]

    top = [
        Vector((-t, -t, height)),
        Vector(( t, -t, height)),
        Vector(( t,  t, height)),
        Vector((-t,  t, height)),
    ]

    verts = [bm.verts.new(co + Vector((0, 0, offset_z))) for co in bottom + top]

    bm.faces.new([verts[0], verts[1], verts[2], verts[3]])  # bottom
    bm.faces.new([verts[4], verts[5], verts[6], verts[7]])  # top

    for i in range(4):
        bm.faces.new([
            verts[i],
            verts[(i + 1) % 4],
            verts[(i + 1) % 4 + 4],
            verts[i + 4]
        ])

    bm.to_mesh(mesh)
    bm.free()

    # 재질 추가 (선택사항)
    if material_name:
        mat = bpy.data.materials.get(material_name)
        if not mat:
            mat = bpy.data.materials.new(name=material_name)
        obj.data.materials.append(mat)

    return obj

# 거푸집 외형
formwork = create_tapered_cube(
    name="Formwork",
    bottom_size=mm(250),
    top_size=mm(200),
    height=mm(300),
    material_name="FormworkMaterial"
)

# 속의 콘크리트
concrete = create_tapered_cube(
    name="Concrete",
    bottom_size=mm(240),  # 내부는 약간 작게
    top_size=mm(190),
    height=mm(295),
    offset_z=mm(2.5),  # 살짝 띄워서 거푸집 안에 들어가게
    material_name="ConcreteMaterial"
)

# 위치 이동 약간 위로
formwork.location.z += mm(150)
concrete.location.z += mm(150)

🖼️ 결과

  • Formwork: 외형 거푸집 (250→200mm, 높이 300mm)
  • Concrete: 속의 돌 (240→190mm, 높이 295mm), 약간 작게 설정하여 안에 들어가는 느낌
  • 기본적으로 z축을 위로 하여 바닥 위에 세워지는 형태

💡 실행 방법

  1. Blender 실행
  2. [Scripting] 탭 이동
  3. 새 Script 작성 후 붙여넣기
  4. ▶ Run Script 클릭

 

위의 코드에서 거푸집의 형태는 콘크리트를 boolean에서 빼기 기능이나 기타 기능으로 콘크리트를 제외한 모양으로 나오게 할 수 있는가? 철판 1.5T 304HairLine 소재로 용접해서 만들거야.

 

Boolean Modifier를 이용해서, 콘크리트를 거푸집에서 빼는 방식으로 **속이 비어 있는 거푸집 형태(얇은 철판 구조)**를 만들 수 있습니다.


✅ 목표

  1. 거푸집(Formwork): 두께가 1.5mm인 속 빈 구조물 (외형은 250→200mm)
  2. 콘크리트(Concrete): 내부에 위치하는 돌 (240→190mm), 거푸집보다 작음
  3. 거푸집에서 콘크리트를 Boolean Difference(차집합) 처리해서 속이 빈 형태로 만들기

🧱 수정된 Blender Python 코드

import bpy
import bmesh
from mathutils import Vector

def mm(val):
    return val / 1000

# 기존 객체 모두 삭제
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

# 기본 파라미터
bottom_out = mm(250)
top_out = mm(200)
bottom_in = bottom_out - mm(3)   # 양쪽 1.5mm씩 줄임
top_in = top_out - mm(3)
height = mm(300)

# 외형 거푸집 생성
def create_tapered_cube(name, bottom_size, top_size, height):
    mesh = bpy.data.meshes.new(name + "_mesh")
    obj = bpy.data.objects.new(name, mesh)
    bpy.context.collection.objects.link(obj)
    bm = bmesh.new()

    b = bottom_size / 2
    t = top_size / 2

    bottom = [
        Vector((-b, -b, 0)),
        Vector(( b, -b, 0)),
        Vector(( b,  b, 0)),
        Vector((-b,  b, 0)),
    ]

    top = [
        Vector((-t, -t, height)),
        Vector(( t, -t, height)),
        Vector(( t,  t, height)),
        Vector((-t,  t, height)),
    ]

    verts = [bm.verts.new(v) for v in bottom + top]

    bm.faces.new([verts[0], verts[1], verts[2], verts[3]])  # 바닥
    bm.faces.new([verts[4], verts[5], verts[6], verts[7]])  # 상단

    for i in range(4):
        bm.faces.new([
            verts[i],
            verts[(i + 1) % 4],
            verts[(i + 1) % 4 + 4],
            verts[i + 4]
        ])

    bm.to_mesh(mesh)
    bm.free()
    return obj

# 외부 껍데기 (Formwork)
outer = create_tapered_cube("Formwork_Outer", bottom_out, top_out, height)
outer.location.z += height / 2

# 내부 콘크리트 모양 (Boolean용)
inner = create_tapered_cube("Formwork_Inner", bottom_in, top_in, height - mm(3))  # 내부는 약간 낮게
inner.location.z += height / 2 + mm(1.5)  # 중앙에 맞게 위치 조정

# Boolean Difference로 속 파내기
bpy.context.view_layer.objects.active = outer
mod_bool = outer.modifiers.new(name="CutOut", type='BOOLEAN')
mod_bool.operation = 'DIFFERENCE'
mod_bool.object = inner
bpy.ops.object.modifier_apply(modifier=mod_bool.name)

# 내부 오브젝트는 삭제
bpy.data.objects.remove(inner, do_unlink=True)

# 재질 설정 (304 Hairline 느낌용)
mat = bpy.data.materials.new(name="304Hairline")
mat.use_nodes = True
outer.data.materials.append(mat)

🖼️ 결과

  • Formwork: 속이 비어 있음 (내부 콘크리트 형상 제거됨)
  • 두께는 **1.5mm (양면 총 3mm)**로 설정
  • 사용 후 내부 오브젝트 삭제
  • Blender 상에서 실제 제작 가능한 철판 가공 모델에 근접한 형태

🔧 팁

  • 3D 프린트 용도 또는 제작용 DWG 추출 시 이 방식이 매우 유용합니다.
  • 1.5T 철판이라면 실제 모델링에서도 너무 얇지 않게 최소 두께를 확보해주세요.
  • 원한다면 외부 거푸집을 Solidify Modifier로도 생성할 수 있습니다.

 

내가 필요한 것은 콘크리트 객체, 그리고 그 콘크리트를 만들 거푸집(속이 빈 형태의 객체)이 필요하다.

 


✅ 요구사항 정리

객체 설명

🔹 콘크리트 실제 고체 형태의 기초석 (안쪽 덩어리)
🔹 거푸집 콘크리트를 부을 때 사용하는 속이 빈 틀, 두께 1.5mm (실제 철판 구조)

✅ 구조 설계 개념

  • 콘크리트
    하부 240mm → 상부 190mm, 높이 295mm (거푸집보다 살짝 작고 낮음)
  • 거푸집 (Formwork)
    외부: 250mm → 200mm, 높이 300mm
    내부: 247mm → 197mm (1.5mm씩 안쪽으로 줄인 내부 볼륨)
    → 내부 덩어리를 Boolean Difference로 빼서 속이 빈 거푸집 형태로 생성

🧱 최종 Blender Python 코드

import bpy
import bmesh
from mathutils import Vector

def mm(val): return val / 1000

# 전체 삭제
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

def create_tapered_mesh(name, bottom_size, top_size, height):
    mesh = bpy.data.meshes.new(name + "_mesh")
    obj = bpy.data.objects.new(name, mesh)
    bpy.context.collection.objects.link(obj)
    bm = bmesh.new()

    b = bottom_size / 2
    t = top_size / 2

    bottom = [Vector((-b, -b, 0)), Vector(( b, -b, 0)),
              Vector(( b,  b, 0)), Vector((-b,  b, 0))]
    top = [Vector((-t, -t, height)), Vector(( t, -t, height)),
           Vector(( t,  t, height)), Vector((-t,  t, height))]

    verts = [bm.verts.new(v) for v in bottom + top]

    bm.faces.new(verts[0:4])  # 바닥
    bm.faces.new(verts[4:8])  # 윗면

    for i in range(4):
        bm.faces.new([
            verts[i],
            verts[(i+1)%4],
            verts[(i+1)%4+4],
            verts[i+4]
        ])

    bm.to_mesh(mesh)
    bm.free()
    return obj

### 1. 콘크리트 객체
concrete = create_tapered_mesh(
    name="Concrete",
    bottom_size=mm(240),
    top_size=mm(190),
    height=mm(295)
)
concrete.location.z = mm(2.5 + 147.5)  # 거푸집보다 조금 위로

### 2. 거푸집 외형
formwork_outer = create_tapered_mesh(
    name="FormworkOuter",
    bottom_size=mm(250),
    top_size=mm(200),
    height=mm(300)
)
formwork_outer.location.z = mm(150)

### 3. 거푸집 내부 (Boolean용)
formwork_inner = create_tapered_mesh(
    name="FormworkInner",
    bottom_size=mm(247),  # 1.5mm x 2 줄임
    top_size=mm(197),
    height=mm(297)
)
formwork_inner.location.z = mm(1.5 + 148.5)

### 4. 거푸집 내부 빼기 → 속 빈 거푸집 생성
bpy.context.view_layer.objects.active = formwork_outer
mod_bool = formwork_outer.modifiers.new(name="HollowOut", type='BOOLEAN')
mod_bool.operation = 'DIFFERENCE'
mod_bool.object = formwork_inner

bpy.ops.object.modifier_apply(modifier=mod_bool.name)

# 내부 형상 제거 (거푸집 내부는 이제 속이 빔)
bpy.data.objects.remove(formwork_inner, do_unlink=True)

### 💡 재질 추가 (선택)
mat = bpy.data.materials.new("304Hairline")
formwork_outer.data.materials.append(mat)

✅ 결과

객체 이름 설명

Concrete 기초석 (실제 덩어리)
FormworkOuter 1.5T 철판으로 만든 속이 빈 거푸집

📌 주의사항

  • 거푸집은 실제로 1.5mm 두께가 적용된 형상입니다.
  • 콘크리트는 거푸집 안에 자연스럽게 들어가도록 조금 작고 낮게 설정했습니다.
  • 이 코드를 그대로 실행하면 완성된 상태의 두 객체가 3D 뷰포트에 나옵니다.

 

반응형