만들고자 하는 형태를 기술함.
블랜더에서 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축을 위로 하여 바닥 위에 세워지는 형태
💡 실행 방법
- Blender 실행
- [Scripting] 탭 이동
- 새 Script 작성 후 붙여넣기
- ▶ Run Script 클릭
위의 코드에서 거푸집의 형태는 콘크리트를 boolean에서 빼기 기능이나 기타 기능으로 콘크리트를 제외한 모양으로 나오게 할 수 있는가? 철판 1.5T 304HairLine 소재로 용접해서 만들거야.
Boolean Modifier를 이용해서, 콘크리트를 거푸집에서 빼는 방식으로 **속이 비어 있는 거푸집 형태(얇은 철판 구조)**를 만들 수 있습니다.
✅ 목표
- 거푸집(Formwork): 두께가 1.5mm인 속 빈 구조물 (외형은 250→200mm)
- 콘크리트(Concrete): 내부에 위치하는 돌 (240→190mm), 거푸집보다 작음
- 거푸집에서 콘크리트를 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 뷰포트에 나옵니다.
반응형
'Graphics > Blender 3D' 카테고리의 다른 글
블랜더3D, 건물의 파고라 형태 제작 python코드 제작 기록 (0) | 2025.04.13 |
---|---|
블렌더에서 파이썬으로 3D 입체 만들기 – 가로, 세로, 높이 설정하는 방법 (0) | 2025.03.21 |
[blender3D] pincipled BSDF 사용 플라스틱 설정값 (0) | 2023.04.08 |
blender3D png를 mesh로 만들 수 있나? (0) | 2023.04.06 |
Blender 2.93 3D 모델링, 캐드처럼 큐브에 치수선 넣기, 블랜더에 치수선 넣어보자 (0) | 2021.08.03 |