mr.esat
Üstün
- Katılım
- 22 Aralık 2023
- Mesajlar
- 4.426
- Çözümler
- 12
- Beğeniler
- 5.499
2duniverse
Çoğunlukla impuls teorisi üzerine kurulu bir fizik motoru çekirdeği yazdım.
Modüler olduğu için çoğu fiziksel niceliği ve kuvveti update ile ekleyebilirim. Esnek bir yapıya sahip oldu.
Ncurses kütüphanesini kullanıyor.
Cisme Etkileyen Kuvvet
Kuvvet * Zaman, Momentum değişimine eşit olduğu için, programda bir frekansla (rate) çalıştığı için; kuvvet bir program döngüsünde momentum değişimi yaratarak temsil ediliyor.
Yani, program RATE'ini 200 olarak tanımlarsak, 1 program stepimiz 5 ms olacak. Bir program stepinde sürekli N büyüklüğünde bir kuvvetten bahsedecek olursa, 5 ms boyunca N kuvveti cisme etki edecek, böylelikle cismin momentum değişimi (0.005)*N olacak. Momentum değişimini de cismin kütlesine bölersek hız değişimini elde etmiş olacağız.
Tabi, programın kordinat sistemi iki boyutta olduğu için 2 farklı eksen için bunları hesapladım.
Esnek Çarpışma
Gerçek hayatta sonsuz andan bahsedebiliriz, yani en küçük zaman birimimiz dt, neredeyse 0. Bundan ötürü çarpışmaların hata toleransı yok. Fakat bilgisayarlar sonsuz anı hesaplayamayacağından ötürü bir hata toleransları var.
RATE'i 200 olarak tanımlarsak, programın her step arasında 5 ms'lik bir gecikmesi olacak. X. Stepte temas yok, x + 1. Stepte ise temas olduğunda muhtemelen iç içe geçme meydana gelecek.
Yani, çarpışma için bilgisayar geç kaldı.
Yapacak bir şey yok, aslında Counter Strike 2'deki sub-tick rate mantığı bu durum için belki bir çözüm sunardı fakat benim program klasik rate mantığında olduğu için bu hata ister istemez meydana geliyor. Gecikme, rahatsız edici olmasa da x ve y eksenlerinde iç içe geçme olduğunda başka bir problem meydana geliyor. İlk hangi eksen birbirine dokundu?
Bunun cevabını bulmak için cisimlerin y eksenindeki ve x eksenindeki iç içe geçmelerini buldum. Sonrasında cisimlerin birbirlerine göre olan hızlarını buldum.
Sonuçlar pozitif olacak şekilde iç içe geçmeleri ve göreceli hızları iki eksen için hesapladım.
En sonunda, toplam iç içe geçme / toplam içeri olan hız şeklinde bir zaman hesapladık. Hangi eksen için bu zaman önceyse önce o eksenden iç içe girme başlamış demek. Hangisi önce ise o eksen için çarpışma hesapladım.
Hız ve yer değiştirme fonksiyonları bu iki fonksiyona göre oldukça basit. Bu yüzden onları anlatıp lafı uzatmak istemiyorum.
Ncurses ile de terminale çizim yaptırdım. Ncurses kullanmasa idim ilgi çekici olmazdı fakat ncurses kullandığım için ilginç bir imalat ortaya çıktı. Terminalinizde bir çarpışma laboratuvarının olması bence ilginç.
Esnek çarpışmanın reel kökünü hemen bulmak için matematiksel formülde, debug işlemlerinde ve programın matematik erroru vermemesi için fix yapmada yapay zekaya başvurdum. Çekirdek, syntax. Her şey bana ait ama. Projeyi ben yaptım.
Maalesef, şu an için sadece Linux / macOS'ta çalıştırabiliyorsunuz. Ncurses'i sanırım Windows'ta çalıştıramıyoruz. Alternatifleri var, kaynak kodu da mevcut zaten. Claude muhtemelen saniyeler içinde portlayabilir
. Tabi o farklı bir proje olacaktır. Bu kaynak kod Windows'a maalesef derlenmiyor.
Programımın arayüzü:
Programımdan bir kesit:
C ile yazdım.
Kaynak kodları: GitHub - Esatttt/2duniverse: 2D physics core in your terminal
Çoğunlukla impuls teorisi üzerine kurulu bir fizik motoru çekirdeği yazdım.
Modüler olduğu için çoğu fiziksel niceliği ve kuvveti update ile ekleyebilirim. Esnek bir yapıya sahip oldu.
Ncurses kütüphanesini kullanıyor.
Cisme Etkileyen Kuvvet
Kuvvet * Zaman, Momentum değişimine eşit olduğu için, programda bir frekansla (rate) çalıştığı için; kuvvet bir program döngüsünde momentum değişimi yaratarak temsil ediliyor.
Yani, program RATE'ini 200 olarak tanımlarsak, 1 program stepimiz 5 ms olacak. Bir program stepinde sürekli N büyüklüğünde bir kuvvetten bahsedecek olursa, 5 ms boyunca N kuvveti cisme etki edecek, böylelikle cismin momentum değişimi (0.005)*N olacak. Momentum değişimini de cismin kütlesine bölersek hız değişimini elde etmiş olacağız.
Tabi, programın kordinat sistemi iki boyutta olduğu için 2 farklı eksen için bunları hesapladım.
Esnek Çarpışma
Gerçek hayatta sonsuz andan bahsedebiliriz, yani en küçük zaman birimimiz dt, neredeyse 0. Bundan ötürü çarpışmaların hata toleransı yok. Fakat bilgisayarlar sonsuz anı hesaplayamayacağından ötürü bir hata toleransları var.
RATE'i 200 olarak tanımlarsak, programın her step arasında 5 ms'lik bir gecikmesi olacak. X. Stepte temas yok, x + 1. Stepte ise temas olduğunda muhtemelen iç içe geçme meydana gelecek.
Yani, çarpışma için bilgisayar geç kaldı.
Yapacak bir şey yok, aslında Counter Strike 2'deki sub-tick rate mantığı bu durum için belki bir çözüm sunardı fakat benim program klasik rate mantığında olduğu için bu hata ister istemez meydana geliyor. Gecikme, rahatsız edici olmasa da x ve y eksenlerinde iç içe geçme olduğunda başka bir problem meydana geliyor. İlk hangi eksen birbirine dokundu?
Bunun cevabını bulmak için cisimlerin y eksenindeki ve x eksenindeki iç içe geçmelerini buldum. Sonrasında cisimlerin birbirlerine göre olan hızlarını buldum.
Sonuçlar pozitif olacak şekilde iç içe geçmeleri ve göreceli hızları iki eksen için hesapladım.
En sonunda, toplam iç içe geçme / toplam içeri olan hız şeklinde bir zaman hesapladık. Hangi eksen için bu zaman önceyse önce o eksenden iç içe girme başlamış demek. Hangisi önce ise o eksen için çarpışma hesapladım.
Hız ve yer değiştirme fonksiyonları bu iki fonksiyona göre oldukça basit. Bu yüzden onları anlatıp lafı uzatmak istemiyorum.
Ncurses ile de terminale çizim yaptırdım. Ncurses kullanmasa idim ilgi çekici olmazdı fakat ncurses kullandığım için ilginç bir imalat ortaya çıktı. Terminalinizde bir çarpışma laboratuvarının olması bence ilginç.
Esnek çarpışmanın reel kökünü hemen bulmak için matematiksel formülde, debug işlemlerinde ve programın matematik erroru vermemesi için fix yapmada yapay zekaya başvurdum. Çekirdek, syntax. Her şey bana ait ama. Projeyi ben yaptım.
Maalesef, şu an için sadece Linux / macOS'ta çalıştırabiliyorsunuz. Ncurses'i sanırım Windows'ta çalıştıramıyoruz. Alternatifleri var, kaynak kodu da mevcut zaten. Claude muhtemelen saniyeler içinde portlayabilir
Programımın arayüzü:
Programımdan bir kesit:
C ile yazdım.
Kaynak kodları: GitHub - Esatttt/2duniverse: 2D physics core in your terminal