입자 생명 시뮬레이션
- 원자와 같은 입자들 사이의 단순한 인력과 척력의 규칙을 사용하여 원시 인공 생명을 시뮬레이션하는 간단한 프로그램.
- GUI 요소를 제외하고 코드는 한 페이지 미만임.
- 비디오 튜토리얼과 안내는 아래에서 확인 가능함.
자세히 알아보기 (YouTube 비디오 튜토리얼)
온라인 데모 (JavaScript 버전)
인터페이스 (C++ 버전)
예시 결과
재현할 수 있는 몇 가지 흥미로운 패턴
- 이 패턴들을 재현하기 위해 매개변수를 정확히 일치시킬 필요는 없음.
- 흥미로운 패턴을 얻는 가장 좋은 방법은 먼저 무작위 매개변수 탐색을 시도하는 것.
- 흥미로운 패턴을 발견하면 점진적으로 미세 조정을 시도함.
- 국소 최대치에 머무르지 않기 위해 가끔 큰 매개변수 점프를 할 수 있음.
사용 방법
- 이 저장소를 다운로드하고 압축을 풀어 /particle_life/bin/ 폴더로 이동한 다음 particle_life.exe를 클릭함.
코드
- 소스 코드는 C++, JavaScript, Python으로 제공됨.
- YouTube 비디오 튜토리얼 링크 제공.
- C++ 프로그램에 기여하고 싶다면 핵심 알고리즘은 "/particle_life/src/ofApp.cpp"의 처음 100줄에 있음.
- 나머지는 openFrameworks 라이브러리에 의해 제공되는 GUI 구성 요소 및 렌더링 컨트롤임.
- 시작하려면 이 저장소와 openFrameworks 라이브러리를 다운로드하고, openFramework의 projectGenerator를 사용하여 /particle_life/ 폴더를 프로젝트에 가져옴.
- 또는 새 openFramework 프로젝트를 생성하고 ofxGui를 추가한 후, 생성된 프로젝트 파일을 여기서 제공하는 /src/ 폴더로 교체함.
- 이제 C++ 코드를 컴파일할 수 있음.
다른 포트
- Godot, Rust, Go-1, Go-2, Go-3, Python, Lua, QB64-PE, WebGL, Java, C# Winforms, FreeBasic 등 다양한 언어로 포팅된 버전 목록 제공.
JavaScript 코드 예시
- JavaScript 코드 예시와 최적화된 버전인 particle_life.html 파일을 확인할 수 있음.
관련 주제
- 입자 생명 시뮬레이션, 원시국물 - 진화, 콘웨이의 생명 게임, 셀룰러 오토마타, 자기 조직화 패턴 등에 대한 설명.
- 이 프로젝트는 Jeffery Ventrella의 Clusters에서 영감을 받았으며, 충돌 감지를 구현하지 않아 실시간으로 수천 개의 입자를 시뮬레이션할 수 있었음.
- GUI 컨트롤을 추가하여 매개변수를 실시간으로 쉽게 미세 조정하고 탐색할 수 있게 함으로써, 매우 단순한 관계 모델에서 본 적 없는 패턴이 나타나게 됨.
- 이 코드는 교육 자료로 시작되었으며, 복잡성이 단순성에서 비롯될 수 있음을 증명하기 위해 비프로그래머와 일반 대중을 대상으로 함.
할 일 목록
- 매개변수를 저장하고 불러올 수 있는 기능 추가 (사람들이 흥미로운 모델을 쉽게 공유할 수 있도록)
- 더 많은 입자 유형을 추가할 수 있는 기능 (현재는 네 가지 입자 유형으로 고정)
- 현재 가장 큰 병목 현상은 모든 입자 간의 쌍별 거리를 계산하는 중첩된 for 루프로, 계산 복잡도가 이차적임.
- 3번 항목의 대안으로, 쌍별 거리 계산은 GPU에서 계산할 수 있을 정도로 병렬 처리가 가능함.
- 화면 크기를 조정하는 기능 추가 및 경계 검사 개선 (많은 빠른 움직임을 가진 입자들이 화면 경계를 벗어날 수 있음).
- 매개변수에 대한 더 세밀한 제어를 가능하게 하는 더 직관적인 UI 추가.
- 무작위 버튼 추가 또는 더 나은 방법으로, 초기 규칙을 지속적으로 변화시키는 간단한 메타 규칙을 가짐으로써 패턴이 국소 최대치에 머무르지 않고 계속 변화하게 함.
- 매개변수를 선택하고 최적화하기 위해 진화 알고리즘을 사용하는 것이 더 나은 방법이지만, 이를 위해서는 적합도 함수를 작성해야 함. 현재 이 프로그램의 영역에서 적합도 함수가 무엇인지 알지 못함.
GN⁺의 의견
- 이 프로젝트는 복잡한 생명 현상이 단순한 규칙에서 어떻게 발생할 수 있는지를 시각적으로 보여주는 데 큰 가치가 있음.
- 프로그래밍과 인공 생명 연구에 관심이 있는 초급 소프트웨어 엔지니어에게 흥미로운 입문 자료가 될 수 있음.
- 다양한 언어로 포팅된 버전이 있어서, 다양한 프로그래밍 언어에 대한 이해를 넓히는 데 도움이 될 수 있음.