Bu sitedeki içerik yapay zeka (AI) veya makine çeviri teknolojisi kullanılarak çevrilmiştir ve hatalar içerebilir.

Skip to content

Gelişmiş Fizik Çözücü ile Simülasyon ve Performansı İyileştirme

2015 yılının ortalarında Roblox, fizik motorunda önemli bir güncelleme duyurdu: Projected Gauss-Seidel (PGS) fizik çözücü. İlk yıl boyunca yeni çözücü isteğe bağlıydı ve daha önce kullanılan yay çözücüye kıyasla daha yüksek doğruluk ve daha iyi performans sağladı.

2016 yılında, çeşitli yeni fizik kısıtlamaları için destek ekledik, böylece geliştiricileri yeni çözücüye geçmeye teşvik ettik ve fizik motorunun yaratıcı yeteneklerini genişlettik. Yeni yerlerin tümü varsayılan olarak PGS çözücüsünü kullanıyordu, ancak klasik çözücüye geri dönme seçeneği de mevcuttu.

2018 ortasında hibrit LDL-PGS çözücüsünü devreye sokarak, yüksek kütle farkları ve karmaşık mekanizmalarla ilgili bazı kararlılık sorunlarını giderdik. Bu, eski çözücüyü gereksiz hale getirdi ve 2019'da tamamen devre dışı bırakılarak tüm yerler otomatik olarak PGS'ye geçirildi.

2019'da, simülasyonu simülasyon parçalarının birbirine bağlı adalarından oluşan işlere bölen çoklu iş parçacığı kullanılarak performans daha da iyileştirildi. Hala LDL ile ilgili performans sorunlarımız vardı, ancak bunları 2020'nin başlarında nihayet çözdük.

Fizik motoru, performans açısından hala geliştirilmekte ve optimize edilmektedir; yakın gelecekte yeni özellikler eklemeyi planlıyoruz.

Fizik Kanunlarının Uygulanması

Bir fizik motorunun temel amacı, sanal bir ortamda cisimlerin hareketini simüle etmektir. Fizik motorumuzda, sert olan, çarpışan ve birbirleriyle kısıtlamaları olan cisimlerle ilgileniyoruz.

Bir fizik motoru, çarpışma algılama ve çözümleme olmak üzere iki aşamadan oluşur. Çarpışma algılama, sert cisimlerle ilişkili geometriler arasındaki kesişim noktalarını bulur ve çarpışma noktaları, normaller ve penetrasyon derinlikleri gibi uygun çarpışma bilgilerini üretir. Ardından bir çözümleyici, algılanan çarpışmaların ve kullanıcı tarafından sağlanan kısıtlamaların etkisi altında sert cisimlerin hareketini günceller.

Hareket, çözücünün enerji ve momentumun korunumu gibi fizik kanunlarını yorumlamasının sonucudur. Ancak bunu %100 doğru bir şekilde yapmak çok pahalıdır ve bunu gerçek zamanlı olarak simüle etmenin püf noktası, sonuç fiziksel olarak gerçekçi olduğu sürece performansı artırmak için yaklaşık değerler kullanmaktır. Temel hareket kanunları makul bir tolerans aralığında tutulduğu sürece, bu ödün verme bilgisayar oyunu simülasyonu için tamamen kabul edilebilir bir durumdur.

Küçük Adımlar Atmak

Fizik motorunun ana fikri, zaman adımlamasını kullanarak hareketi ayrıştırmaktır. Kısıtlı ve kısıtlanmamış katı cisimlerin hareket denklemlerini doğrudan ve doğru bir şekilde entegre etmek çok zordur. Ayrıştırma, hareketi küçük zaman artışlarına böler; burada denklemler basitleştirilir ve doğrusallaştırılır, böylece yaklaşık olarak çözülmeleri mümkün hale gelir. Bu, her zaman adımı sırasında, bir kısıtlamaya dahil olan katı cisimlerin ilgili parçalarının hareketinin doğrusal olarak yaklaşık olarak hesaplandığı anlamına gelir.

drift.gif

Doğrusal hale getirilmiş bir problem çözülmesi daha kolay olsa da, dönme hareketi gibi doğrusal olmayan davranışlar içeren bir simülasyonda sapma yaratır. Daha sonra, sapmayı azaltmaya ve simülasyonu daha makul hale getirmeye yardımcı olan hafifletme yöntemlerini göreceğiz.

Çözümleme

Bir zaman adımı için hareket denklemlerini doğrusallaştırdıktan sonra, bir doğrusal sistem veya doğrusal tamamlayıcılık problemini (LCP) çözmemiz gerekir. Bu sistemler keyfi olarak büyük olabilir ve tam olarak çözülmesi oldukça maliyetli olabilir. Yine burada da püf noktası, daha hızlı bir yöntem kullanarak yaklaşık bir çözüm bulmaktır. İyi yakınsama özelliklerine sahip bir LCP'yi yaklaşık olarak çözmek için kullanılan modern bir yöntem, Projected Gauss-Seidel (PGS) yöntemidir. Bu, yinelemeli bir yöntemdir; yani her yinelemede yaklaşık çözüm gerçek çözüme yaklaşır ve nihai doğruluğu yineleme sayısına bağlıdır.

Bu animasyon, bir PGS çözücünün yineleme sürecinin her adımında cisimlerin konumlarını nasıl değiştirdiğini göstermektedir. Amaç, her adımda kütle merkezini korurken top ve yuva kısıtlamalarına uyan konumları bulmaktır (bu, IK dragger tarafından kullanılan bir tür konumsal çözücüdür). Bu örneğin basit bir analitik çözümü olsa da, PGS'nin arkasındaki fikri iyi bir şekilde göstermektedir. Her adımda, çözücü kısıtlamalardan birini sabitler ve diğerinin ihlal edilmesine izin verir. Birkaç yinelemeden sonra, cisimler doğru konumlarına çok yaklaşır. Bu yöntemin bir özelliği, bazı katı cisimlerin, özellikle daha ağır cisimlerle etkileşimde bulunduklarında, nihai konumlarının etrafında titriyor gibi görünmesidir. Yeterli sayıda yineleme yapmazsak, sarı parça, iki kısıtlamasından birinin önemli ölçüde ihlal edildiği, gözle görülür şekilde geçersiz bir durumda kalabilir. Buna yüksek kütle oranı sorunu denir ve istikrarsızlıklara ve patlamalara neden olduğu için fizik motorlarının baş belası olmuştur. Çok fazla yineleme yaparsak çözücü çok yavaşlar, yapmazsak istikrarsız hale gelir. İki taraf arasında dengeyi sağlamak, zahmetli ve uzun bir süreç olmuştur.

Azaltma Stratejileri

Bir çözücünün iki ana yanlışlık kaynağı vardır: zaman adımları ve yinelemeli çözümleme (ayrıca kayan nokta sapması da vardır, ancak bu ilk ikisine kıyasla önemsizdir). Bu yanlışlıklar simülasyonda hatalara yol açar ve simülasyonun doğru yoldan sapmasına neden olur. Bu sapmaların bir kısmı, hafif hız farklılıkları veya enerji kaybı gibi tolere edilebilirken, bazıları kararsızlıklar, büyük enerji kazançları veya yerinden çıkmış kısıtlamalar gibi tolere edilemez.

Bu nedenle, çözücüdeki karmaşıklığın büyük bir kısmı, hesaplama hatalarının etkisini en aza indirgemek için kullanılan yöntemlerin uygulanmasından kaynaklanmaktadır. Nihai uygulamamızda hem geleneksel hem de yeni bazı hafifletme stratejileri kullanılmaktadır:

  1. Sıcak başlatma: yinelemeli çözücünün yakınsama hızını artırmak için önceki bir zaman adımındaki çözümle başlama
  2. Post-stabilizasyon: kısıtlama sapmasını önlemek için sistemi kısıtlama manifolduna geri yansıtma
  3. Düzenleme: bir çözümün var olmasını ve benzersiz olmasını sağlayan kısıtlamalara uyum ekleme
  4. Ön koşullandırma: karmaşık mekanizmaların kararlılığını artırmak için doğrusal bir alt sisteme ait kesin bir çözümü kullanma

Stratejiler 1, 2 ve 3 oldukça gelenekseldir, ancak 3. strateji tarafımızdan geliştirilmiş ve mükemmelleştirilmiştir. Ayrıca, 4. strateji hiç duyulmamış bir şey olmasa da, bunun pratik bir uygulamasını görmedik. Büyük seyrek kısıt matrisleri için özgün bir faktörleştirme yöntemi ve bunu PGS ile birleştirmenin yeni ve verimli bir yolunu kullanıyoruz. Ortaya çıkan uygulama, saf PGS'ye kıyasla sadece biraz daha yavaştır, ancak eşitlik kısıtlarından gelen doğrusal sistemin tam olarak çözülmesini sağlar. Sonuç olarak, eşitlik kısıtları sadece zaman ayrıştırmasından kaynaklanan sapmadan etkilenir. Yöntemlerimizle ilgili ayrıntılar GDC 2020 sunumumda yer almaktadır. Şu anda, eşitsizlik kısıtlarına ve çarpışmalara uygulanan doğrudan yöntemleri araştırıyoruz.

Daha Fazla Ayrıntı

Geleneksel olarak, mafsallı mekanizmalar için iki matematiksel model vardır: her bir mafsaldaki serbestlik derecelerini parametreleştiren, Featherstone tarafından öncülüğü yapılan indirgenmiş koordinat yöntemleri ve Lagrange formülasyonunu kullanan tam koordinat yöntemleri.

Biz, daha az kısıtlayıcı olması ve çok daha basit matematik ve uygulama gerektirmesi nedeniyle ikinci formülasyonu kullanıyoruz.

Roblox motoru, daha önce kullanılan ceza yöntemlerinin aksine, kısıtlamaların dinamik tepkisini hesaplamak için analitik yöntemler kullanır. Analitik yöntemler ilk olarak Baraff 1989'da tanıtılmış ve burada hem eşitlik hem de eşitsizlik kısıtlamalarını tutarlı bir şekilde ele almak için kullanılmıştır. Baraff, temas modelinin kuadratik programlama kullanılarak formüle edilebileceğini gözlemlemiş ve bir sezgisel çözüm yöntemi sunmuştur (bu, çözücümüzde kullandığımız yöntem değildir).

Kuvvet tabanlı formülasyon yerine, hız uzayında, ilk olarak Mirtich-Canny 1995 tarafından tanıtılan ve Stewart-Trinkle 1996 tarafından daha da geliştirilen, farklı temas türlerinin ele alınışını birleştiren ve sürtünmeli temaslar için bir çözümün varlığını garanti eden bir impuls tabanlı formülasyon kullanıyoruz. Her zaman adımında, kısıtlamalar ve çarpışmalar, kısıtlama impulsları nedeniyle hızlarda anlık değişiklikler uygulanarak korunur. İmpuls tabanlı simülasyonun neden üstün olduğuna dair mükemmel bir açıklama, Catto 2014'ün GDC sunumunda yer almaktadır.

Sürtünmesiz temaslar, Baraff 1994'te açıklanan doğrusal tamamlayıcılık problemi (LCP) kullanılarak modellenir. Sürtünme, Projected Gauss-Seidel yinelemeleriyle iç içe geçmiş, sürtünme konisine doğrusal olmayan bir izdüşüm olarak eklenir.

Kısıtlamalarda konum hatalarına yol açan sayısal sapma, Cline-Pai 2003 tarafından tanıtılan sözde hızları kullanan bir post-stabilizasyon tekniği ile çözülür. Bu, sistemi kısıtlama manifolduna geri yansıtan konum uzayında ikinci bir LCP'nin çözülmesini içerir.

LCP'ler, Catto 2005 tarafından yaygınlaştırılan bir PGS / Impulse Solver kullanılarak çözülür (ayrıca bkz. Catto 2009). Bu yöntem yinelemelidir ve her bir kısıtlamayı sırayla ele alır ve bağımsız olarak çözer. Birçok yineleme boyunca ve ideal koşullar altında, sistem küresel bir çözüme yakınsar.

Ek olarak, eşitlik kısıtlamalarındaki yüksek kütle oranı sorunları, eşitlik kısıtlamalarının kısıt matrisinin seyrek LDL ayrıştırması kullanılarak PGS'nin ön koşullandırılmasıyla giderilir. Kısıt matrisinin yoğun alt matrisleri, Body Splitting adını verdiğimiz bir yöntem kullanılarak seyrekleştirilir. Bu, Baraff 1996'da kullanılan LDL ayrıştırmasına benzer, ancak daha genel mekanik sistemlere izin verir ve sistemi kısıt uzayında çözer. Daha fazla bilgi için GDC 2020 sunumuma bakabilirsiniz.

Çözücümüzün mimarisi, hız ve konum adımlamasının kısıt çözümü ile ayrıldığı Guendelman-Bridson-Fedkiw'in fikrini takip eder. Zaman sıralamamız şöyledir:

  1. Hızları ilerletme
  2. Hız uzayında ve konum uzayında kısıt çözümü
  3. Konumları ilerletme

Bu şemanın avantajı, yalnızca geçerli hızları entegre etmesi ve dış kuvvet uygulamasında gecikmeyi sınırlaması, ancak sayısal sapma nedeniyle algılanan kısıtlama ihlallerine az miktarda izin vermesidir.

Rijit cisim simülasyonu için mükemmel bir referans, yakın zamanda ücretsiz olarak erişime açılan Erleben 2005 kitabıdır. Fizik tabanlı animasyon hakkında çevrimiçi dersler, Nilson Souto'nun fizik motoru oluşturma üzerine yazdığı bir blog, Erin Catto'nun modern çözücü yöntemleri üzerine yaptığı çok iyi bir GDC sunumu ve soru sormak için mükemmel yerler olan Bullet Physics Forum ve GameDev gibi forumlar bulabilirsiniz.

Sonuç

Oyun fizik simülasyonu alanı, hem heyecan verici hem de zorlayıcı birçok ilginç problem sunar. Çok sayıda harika matematik ve fizik bilgisi öğrenme ve modern optimizasyon tekniklerini kullanma fırsatları vardır. Bu, matematik, fizik ve yazılım mühendisliğini sıkı bir şekilde birleştiren bir oyun geliştirme alanıdır.

Roblox'un iyi bir katı cisim fizik motoru olsa da, iyileştirilebilecek ve optimize edilebilecek alanlar vardır. Ayrıca, kırılma, deformasyon, yumuşak cisim, kumaş, aerodinamik ve su simülasyonu gibi heyecan verici yeni projeler üzerinde çalışıyoruz.

Ne Roblox Corporation ne de bu blog, herhangi bir şirketi veya hizmeti onaylamakta veya desteklemektedir. Ayrıca, bu blogda yer alan bilgilerin doğruluğu, güvenilirliği veya eksiksizliği konusunda herhangi bir garanti veya taahhüt verilmemektedir.

Bu blog yazısı ilk olarak Roblox Tech Blog'da yayınlanmıştır.