1P by neo 2달전 | favorite | 댓글 1개

입자 생명 시뮬레이션

  • 원자와 같은 입자들 사이의 단순한 인력과 척력의 규칙을 사용하여 원시 인공 생명을 시뮬레이션하는 간단한 프로그램.
  • GUI 요소를 제외하고 코드는 한 페이지 미만임.
  • 비디오 튜토리얼과 안내는 아래에서 확인 가능함.

자세히 알아보기 (YouTube 비디오 튜토리얼)

  • YouTube 비디오 튜토리얼 링크 제공.

온라인 데모 (JavaScript 버전)

  • 2D 및 3D 라이브 데모 링크 제공.

인터페이스 (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 컨트롤을 추가하여 매개변수를 실시간으로 쉽게 미세 조정하고 탐색할 수 있게 함으로써, 매우 단순한 관계 모델에서 본 적 없는 패턴이 나타나게 됨.
  • 이 코드는 교육 자료로 시작되었으며, 복잡성이 단순성에서 비롯될 수 있음을 증명하기 위해 비프로그래머와 일반 대중을 대상으로 함.

할 일 목록

  1. 매개변수를 저장하고 불러올 수 있는 기능 추가 (사람들이 흥미로운 모델을 쉽게 공유할 수 있도록)
  2. 더 많은 입자 유형을 추가할 수 있는 기능 (현재는 네 가지 입자 유형으로 고정)
  3. 현재 가장 큰 병목 현상은 모든 입자 간의 쌍별 거리를 계산하는 중첩된 for 루프로, 계산 복잡도가 이차적임.
  4. 3번 항목의 대안으로, 쌍별 거리 계산은 GPU에서 계산할 수 있을 정도로 병렬 처리가 가능함.
  5. 화면 크기를 조정하는 기능 추가 및 경계 검사 개선 (많은 빠른 움직임을 가진 입자들이 화면 경계를 벗어날 수 있음).
  6. 매개변수에 대한 더 세밀한 제어를 가능하게 하는 더 직관적인 UI 추가.
  7. 무작위 버튼 추가 또는 더 나은 방법으로, 초기 규칙을 지속적으로 변화시키는 간단한 메타 규칙을 가짐으로써 패턴이 국소 최대치에 머무르지 않고 계속 변화하게 함.
  8. 매개변수를 선택하고 최적화하기 위해 진화 알고리즘을 사용하는 것이 더 나은 방법이지만, 이를 위해서는 적합도 함수를 작성해야 함. 현재 이 프로그램의 영역에서 적합도 함수가 무엇인지 알지 못함.

GN⁺의 의견

  • 이 프로젝트는 복잡한 생명 현상이 단순한 규칙에서 어떻게 발생할 수 있는지를 시각적으로 보여주는 데 큰 가치가 있음.
  • 프로그래밍과 인공 생명 연구에 관심이 있는 초급 소프트웨어 엔지니어에게 흥미로운 입문 자료가 될 수 있음.
  • 다양한 언어로 포팅된 버전이 있어서, 다양한 프로그래밍 언어에 대한 이해를 넓히는 데 도움이 될 수 있음.
Hacker News 의견
  • 학교에서 처음 코딩 프로젝트로 Conway의 생명 게임을 했는데, 흑백이 지루해서 RGB "유전자"를 도입하고 부모의 색을 조합하여 변이를 주었음. 보드를 점령하는 "파벌"을 보는 것이 재미있음.
  • 가장 흥미로운 결과물은 한동안 크고 불안정한 덩어리와 안정된 덩어리가 형성되고, 그 상태로 정지하는 것이었음. 그 전에는 기대했던 대로 물체들이 만나고 합쳐지는 현상을 관찰함.
  • 최근 비슷한 것을 만들었는데, 이 버전은 모든 것을 WebGL 셰이더로 처리하고 시뮬레이션 상태를 텍스처/유니폼에 유지함. 더 많은 입자를 시뮬레이션하고 그릴 수 있지만, 일부 지원되지 않는 WebGL 확장 기능을 사용하기 때문에 모든 장치에서 실행되지 않을 수 있음.
  • 이것은 John Conway의 생명 게임보다 더 복잡한 버전으로, 작은 스케일에서 쉽게 생명과 같은 형태가 형성되는 것이 놀랍고, 우리 우주의 매개변수가 생명 형성을 어렵게 만든 것처럼 보임.
  • 관련 링크:
  • Conway의 생명 게임에 다채로운 '유전자'를 섞는 것은 마치 무지개 팔레트로 코딩하는 것 같고, 덩어리들은 자신들만의 작은 드라마를 연출한 후 그냥 휴식을 취하는 것 같음. 시뮬레이션에서는 멋진 동작과 형태가 나타나는데, 마치 캐릭터 대신 형태를 가진 미니 슈퍼히어로 영화 같음.
  • "Altphy"라는 3D 실험을 시작했지만, 실시간 처리에는 너무 복잡해서 의도대로 작동하지 않음. 코드의 일부나 아이디어가 언젠가 발전할 수 있을 것 같아 공유함.
  • Godot 4에서 컴퓨트 셰이더를 사용하여 이와 유사한 작업을 시도했음. 관심이 있다면 확인해볼 것을 추천함.
  • 3D JS 버전을 보고 있으며, 이것은 원래 Conway의 생명 게임이나 90년대 Primordial Life 스크린 세이버 이후로 가장 좋아하는 것일 수 있음. 셰이더 지원을 추가하는 것을 고려해볼 것을 제안함. 느리고 "더 블로비한" 버전을 전체 화면으로 실행하는 것을 보고 싶음. 아마도 맥을 난로로 만들 수도 있지만, 지금은 그것도 보너스임.
  • 매우 멋진 작업이지만, 이를 벽에 걸린 TV에서 실행할 수 없어서 아쉬움. "Particle Life"를 물리학자를 위한 티셔츠 브랜드로 오해했는데, 티셔츠에는 "당신의 말을 듣고 나니, 당신은 그저 양자장에서의 불운한 진동에 불과하므로, 당신이 하는 모든 말을 무시해도 정당하다고 느낀다"와 같은 슬로건이 있을 것으로 기대했음.