빠른 시작¶
지금 바로 실행 가능한 15줄 예제 4개입니다.
1. 낙하하는 박스 (헤드리스 뷰어)¶
import forge3d as f3d
world = f3d.World(gravity=(0, 0, -9.81))
world.add_ground()
box = world.add_box(size=(1, 1, 1), position=(0, 0, 5), mass=1.0)
viewer = f3d.Viewer(world, max_frames=180)
while viewer.is_open:
world.step(dt=1/60)
viewer.draw()
print(f"박스 착지 위치 z = {box.position[2]:.3f} m")
동작 설명: 1 m 정육면체가 중력에 의해 낙하하여 지면에 착지합니다.
Viewer는 기본적으로 헤드리스(창 없음) 모드로 실행되며, draw() 호출마다
처리하거나 저장할 수 있는 (H, W, 3) uint8 ndarray를 반환합니다.
2. 앱 스타일 게임 루프 (창 있는 윈도우)¶
import forge3d as f3d
app = f3d.App("물리 샌드박스", width=1280, height=720, fps=60)
ball = None
@app.on_start
def setup(world: f3d.World) -> None:
global ball
world.add_ground()
ball = world.add_sphere(radius=0.4, position=(0, 0, 6),
material=f3d.Material(color="orange"))
@app.on_update
def update(world: f3d.World, dt: float, inp: f3d.Input) -> None:
if inp.key_pressed(f3d.Key.SPACE):
world.apply_impulse(ball, (0, 0, 8))
app.run()
동작 설명: OS 창이 열립니다. Space를 누르면 공이 위로 튀어오릅니다.
App은 게임 루프, 월드, 뷰어, 입력을 자동으로 관리합니다.
3. 고화질 오프라인 비디오¶
import forge3d as f3d
world = f3d.World(gravity=(0, 0, -9.81))
world.add_ground(material=f3d.Material(color="ground", roughness=0.8))
world.add_sphere(
radius=0.4, position=(0, 0, 4.4), mass=1.0, restitution=0.8,
material=f3d.Material(color="orange"),
)
world.set_camera(position=(4, -7, 3), target=(0, 0, 1))
rec = f3d.Recorder(world, mode="hq", resolution=(1280, 720),
samples=16, output="bounce.mp4")
rec.run(duration=3.0, dt=1/240, fps=60)
동작 설명: 3초의 시뮬레이션이 forge3d의 NumPy 레이트레이서(GPU 불필요)로
풀 품질 오프라인 렌더링되어 bounce.mp4로 저장됩니다.
samples=16은 빠른 미리보기, samples=64는 영화 수준 품질입니다.
4. ECS (엔티티-컴포넌트 시스템)¶
import forge3d as f3d
ew = f3d.EntityWorld()
# 모든 컴포넌트를 한 번에 포함한 동적 박스 엔티티 생성
e = ew.create_entity(
f3d.Transform(position=[0, 0, 5]),
f3d.Rigidbody(mass=1.0),
f3d.MeshRenderer(shape="box", size=(1, 1, 1)),
)
# 물리 스텝
for _ in range(60):
ew.step(dt=1/60)
tf = ew.get_component(e, f3d.Transform)
print(f"엔티티 z = {tf.position[2]:.3f}")