변경 내역¶
forge3d의 모든 주요 변경 사항이 여기에 기록됩니다. 형식은 Keep a Changelog를, 버전 관리는 Semantic Versioning을 따릅니다.
미출시¶
2.2.1 — 2026-06-15 — 패키징 수정¶
수정¶
- PyPI 패키지 의존성 누락 수정 —
pip install pyforge3d설치 시imageio,glfw,moderngl등 렌더링 패키지가 함께 설치되지 않던 문제 수정. 배포 메타데이터에[project.dependencies]가 올바르게 반영됨.
2.2.0 — 2026-06-13 — 게임 개발 편의성 & API 명확화¶
추가¶
Input.axis(neg_key, pos_key) → float— 두 키를[-1, 1]float 축으로 읽는 헬퍼.ScriptedInput에도 동일 추가.OrbitCamera.handle_input(inp, dt, ...)— 마우스 드래그, Q/E 키 회전, 휠 줌을 OrbitCamera 자체에서 처리.CharacterController.move_camera_relative(inp, cam, speed, dt)— yaw 각도 직접 계산 없이 카메라 방향 기준으로 캐릭터 이동.Viewer.show_grid: bool프로퍼티 (생성자 파라미터도 추가) — 기존 내부 접근viewer._renderer._show_grid를 공개 API로 대체.Viewer.draw_text앵커 기반 레이아웃 —x=None/y=None생략 시anchor에 맞게 자동 배치.margin파라미터 추가. 새 앵커:"topcenter","bottomleft","bottomcenter","bottomright".App.__init__렌더 파라미터 추가 —substeps,shadow_resolution,sky_color,show_grid,max_dt.
수정¶
Sentry호버 떠오름 버그 (apps/game/enemies.py) — 호버 raycast에layer_mask미지정으로 자신의 몸통을 맞추던 문제.layer_mask=CollisionLayer.DEFAULT | CollisionLayer.TERRAIN으로 수정.
2.1.1 — 2026-06-11¶
변경¶
- 패키지 설명 및 모든 인코드 태그라인이 "own dynamics, own rules, no compromises."로 업데이트됨
2.1.0 — 2026-06-06 — API 완성도 및 개선¶
개발 중 발견된 버그 수정, 누락 기능, 일관성 개선.
수정¶
- B-1
add_terrain(material=Material(...))커스텀 재질이 스냅샷에 유실되던 문제 —TerrainSnapshot.material/BodySnapshot.material필드에 resolvedMaterial객체 직접 포함 - B-2
Body.name읽기 전용 —namesetter 추가 - B-3
World.restore(path)인스턴스 메서드 추가 (in-place 복원); 기존 classmethodWorld.load()는 유지 - deferred renderer
Material.emissivescalar →(R,G,B)변환 TypeError 수정
추가¶
Body.shape_type,Body.shape_params,Body.rotation_matrix프로퍼티Body.on_collision_begin(cb)/on_collision_end(cb)개별 바디 충돌 콜백Material.emissive: float— 스냅샷 전체 파이프라인 전파Transform.quaternion[w,x,y,z]/Transform.matrix4(4,4)프로퍼티TriggerZone.set_position(),.set_half_extents(),.enabled런타임 조작world.raycast_all(origin, dir, max_dist, layer_mask)— 전체 히트 리스트world.overlap_sphere(center, radius)/world.overlap_box(center, half_extents)공간 쿼리world.add_terrain(..., friction=0.8, layer=CollisionLayer.TERRAIN)파라미터world.step(dt, substeps=1)서브스텝 지원world.update(frame_dt)고정 타임스텝 누산기 (world.fixed_dt,world.max_substeps)world.add_character(position, height, radius)→CharacterController(move/jump/glide)world.profiler→PhysicsProfiler— context manager로 step 타이밍 측정JointTypeStrEnum (HINGE,BALL,PRISMATIC,SPRING,FIXED,DISTANCE)CollisionLayer.mask_for(*layers)비트마스크 헬퍼Viewer(shadow_resolution=N)— 그림자 해상도 지정; 기본값 512 → 1024으로 상향
변경¶
CollisionLayer.TERRAIN = 0x0008(기존BULLET값과 교환;BULLET = 0x0020)
2.0.0 — 2026-06-04 — v2.0: Python-first 고성능 게임/시뮬레이션 엔진¶
v2는 세 가지 축으로 v1을 고도화한다:
- 런타임 성능 — Rust 네이티브 확장 (PyO3 + maturin)으로 물리 핫루프 ≥10× 가속
- 그래픽 파이프라인 — 지연 PBR + CSM + SSAO + HDR + Bloom (OpenGL 4.3+)
- API 생태계 — ECS, 오디오, 애니메이션, 씬 관리, 파티클, UI, 에디터
v1 API 완전 하위 호환: World, Body, Viewer, Recorder 시그니처 동결.
추가 — P25: Rust 네이티브 확장¶
forge3d._core— PyO3 + maturin 혼합 빌드 (Rust 1.96+)forge3d._core.gjk_query(verts_a, verts_b)— GJK + EPA 충돌 감지forge3d._core.bvh_build/bvh_query_pairs— BVH 광역단계 (N=500에서 22× 향상)forge3d._core.pgs_solve— PGS 접촉 솔버 Rust 경로forge3d._core.se3_mul/quat_normalize/quat_mul— SIMD 수학 (glam 기반)USE_RUST_CORE=0/1환경변수로 Python 폴백 강제 가능
추가 — P26: 모던 렌더링 파이프라인¶
DeferredRenderer— OpenGL 4.3 지연 렌더링- G-Buffer 4채널 (위치/법선/알베도-roughness/emissive-metallic)
- CSM (Cascaded Shadow Maps) 4 cascade, PCF 9-탭
- SSAO 64샘플 + blur 패스
- HDR 프레임버퍼 + ACES 톤맵 + Kawase 블룸
- 인스턴스 렌더링
RenderPassABC — 파이프라인 패스 단위 추상forge3d.render.DeferredRenderer공개
추가 — P27: 엔티티 컴포넌트 시스템¶
EntityWorld— 엔티티 생성/소멸, 컴포넌트 CRUD,query()- 내장 컴포넌트:
Transform,Rigidbody,Collider,MeshRenderer,Script,CameraComponent,LightComponent SystemABC +PhysicsSystem,RenderSystem,ScriptSystembody_to_entity()— v1 Body → ECS 브릿지save_scene()/load_scene()— ECS 씬 JSON 직렬화EntityNotFoundError— 소멸된 엔티티 접근 명확한 오류
추가 — P28: 오디오 시스템¶
AudioClip— WAV/OGG 로드 +from_sine()생성AudioSource,AudioListener— ECS 컴포넌트AudioSystem— OpenAL 자동 감지, 헤드리스 시NullDriver폴백AudioSystem.make_collision_handler()— 충돌 이벤트 → 사운드 트리거 팩토리
추가 — P29: 애니메이션 시스템¶
Skeleton,Bone— 골격 계층, FK 월드 행렬AnimationClip— 키프레임 LERP/SLERP 보간AnimationPlayer,BlendTree— ECS 컴포넌트FABRIKSolver— N링크 FABRIK IK (오차 < 1e-4m 수렴)AnimationSystem— ECS 시스템chain_from_ur5_joints()— UR5 FK 체인 헬퍼
추가 — P30: 씬 관리¶
SceneNode— dirty flag 캐시 + 부모/자식 계층Prefab— JSON save/load/instantiateSceneManager— load/unload/additive 씬 전환 + 콜백
추가 — P31: 파티클 시스템¶
ParticleEmitter— ECS 컴포넌트 (rate/lifetime/gravity/restitution)ParticleSystem— NumPy 벡터화 + JAX vmap 이중 경로 (10만 파티클 < 33ms)- VFX 프리셋:
sparks,smoke,debris,rain
추가 — P32: UI 시스템¶
DebugPanel,InspectorPanel,HierarchyPanel— ImGui 패널 (null 폴백)Canvas— 2D 오버레이 (클리핑, NumPy 래스터화)UISystem— ECS 시스템
추가 — P33: 씬 에디터¶
EditorApp— Play/Pause/Step 상태 머신TranslateGizmo— 레이-구 교차 선택 + 축 드래그EditorLayout— 3패널 레이아웃screen_to_ray()— 화면 좌표 → 월드 레이
추가 — P34 (선택): wgpu 백엔드¶
WgpuRenderer— wgpu-py 기반 오프스크린 렌더러, WGSL PBR 셰이더- wgpu 없는 환경에서
DeferredRenderer자동 폴백
1.1.0 — 2026-06-03 — 게임 제작 대비 릴리즈¶
추가¶
물리 API 확장
World.add_box(static=True)— 정적 박스를 공개 API에서 직접 생성World.add_capsule(static=True)— 정적 캡슐 지원Body.friction/Body.restitutionsetter — 런타임 마찰·반발 계수 변경Body.linear_damping/Body.angular_damping— 속도 감쇠 계수World.weld(body, anchor, local_rotation=...)— 자식 body의 상대 회전 저장 지원World.raycast(origin, direction, max_dist)→RayHit(body, point, normal, distance)
렌더링 — Heightfield 지형 시각화
TerrainSnapshot데이터클래스 (forge3d.TerrainSnapshot)World.add_terrain()시SceneSnapshot.terrains에 자동 포함RealtimeRenderer— heightfield 삼각 메시 생성·렌더링 (shadow pass 포함)render.realtime.meshes.heightfield_mesh(heights, cell_size, origin)공개 함수
카메라
FollowCamera(frame="local")— 차체 로컬 프레임 오프셋FollowCamera(smoothing_hz=6.0)— FPS 독립 지수 감쇠 스무딩FollowCamera.to_snapshot(dt=...)— dt 파라미터로 FPS 독립 스무딩
입력
forge3d.InputBuilder— 공개 클래스로 승격, glfw 콜백과 자동 연결
Viewer
Viewer.draw_text(text, x, y, size, color, bg_alpha, anchor)— HUD 텍스트 오버레이
직렬화
World.save()— 조인트(Hinge/Spring/Distance/Ball/Fixed/Prismatic) 직렬화 포함World.load()— 저장된 조인트 자동 복원
성능¶
World.step()내detect_contacts이중 호출 제거: ~2× 이벤트 처리 속도 향상
수정¶
World.add_terrain()의material파라미터가 Heightfield 렌더에 전달되지 않던 문제
1.0.0 — 2026-06-03 — 안정 릴리즈¶
추가 (P15 — MkDocs 문서 사이트)¶
- MkDocs Material 테마 기반 문서 사이트 (
mkdocs.yml,docs_src/) - API 레퍼런스, 튜토리얼 4종, 아키텍처 개요 페이지
추가 (P16 — 조인트 & 구속 시스템)¶
forge3d.constraints패키지: Sequential Impulse 구속 솔버FixedJoint,BallJoint,HingeJoint(모터·한계 포함),PrismaticJoint,DistanceJoint,SpringJointWorld.add_joint(type, body_a, body_b, ...)통합 API;World.remove_joint(handle)forge3d.JointHandle핸들 클래스
추가 (P17 — 충돌 이벤트 콜백)¶
forge3d.CollisionEvent,forge3d.CollisionHandlerWorld.on_collision_begin,on_collision_stay,on_collision_end데코레이터World.add_collision_handler(body_a, body_b)쌍별 핸들러World.add_trigger_zone(position, size)순수 데이터 존 (물리 충돌 없음)
추가 (P18 — 씬 직렬화)¶
World.save(path)→ JSON 저장World.load(path)클래스 메서드 → World 복원forge3d.StateRecorder— 프레임별 상태 기록 + npz 저장/재현
추가 (P19 — 충돌 레이어·마스크)¶
forge3d.CollisionLayer비트필드 상수Body.collision_layer,Body.collision_mask프로퍼티
추가 (P20 — API 강화)¶
forge3d.errors모듈:Forge3dError,ValidationError,PhysicsError,RenderErrorWorld(),add_box(),add_sphere()인자 검증
추가 (P21 — Heightfield 지형)¶
World.add_terrain(heights, cell_size, origin)→ Heightfield- 구 vs 높이맵, 박스 vs 높이맵 충돌 감지 (쌍선형 보간)
추가 (P23 — 아일랜드 슬리핑)¶
- 바디 슬리핑 카운터,
Body.is_sleeping프로퍼티,PhysicsWorld.wake_body()
변경¶
- 버전 범프:
0.4.0→1.0.0(첫 안정 릴리즈) - Baumgarte 바이어스 부호 수정 (구속 솔버 안정성 대폭 향상)
0.4.0 — 2026-06-03¶
추가 (P14 — PyPI 배포 인프라)¶
- GitHub Actions CI/Release/Docs 워크플로우
- OIDC Trusted Publisher (TestPyPI → PyPI)
.readthedocs.yaml,.github/ISSUE_TEMPLATE/
추가¶
App클래스 —@on_start/@on_update/@on_render데코레이터 기반 게임 루프Input클래스 — 프레임별 키보드/마우스 상태 스냅샷Key— 키 상수 클래스 (Key.SPACE,Key.W,Key.ESCAPE…)OrbitCamera,FollowCameraworld.bodies,world.remove(),world.clear(),world.get_body(name)- AABB 광역 단계 사전 필터: O(n²) → O(n log n)
0.2.0 — 2026-05¶
추가¶
Shape.capsule(),Shape.convex_mesh()— 캡슐·컨벡스 메시 지원forge3d.io.load_obj(path)→MeshData— 순수 Python OBJ 파서- GJK 확장: mesh/capsule 지원 함수, EPA (
collision/epa.py) - PBR 셰이더 (Cook-Torrance BRDF): GGX NDF, Smith geometry, Fresnel-Schlick
- PCF 섀도우 맵 2K, Reinhard 톤맵, 알베도 텍스처 지원
0.1.0 — 2026-03¶
추가¶
World,Body,Shape,Material,Viewer,Recorder— 공개 API- 강체 물리: RNEA, CRBA, ABA; semi-implicit Euler
- 충돌 감지: SAT OBB-OBB, 구, 캡슐
- 임펄스 기반 접촉 솔버 (Coulomb 마찰 + Baumgarte)
- UR5 6-DOF 로봇 모델 (FK + Jacobian)
RealtimeRenderer(OpenGL 3.3 + moderngl),HQRenderer(소프트웨어 레이트레이서)SceneSnapshot— 물리↔렌더 순수 데이터 계약- JAX JIT+vmap 배치 물리 (2000× 처리량)
- NumPy ↔ JAX 백엔드 스위치 (
ENGINE_BACKEND) - 215 자동화 테스트