Bir fizik motorundaki küçük nesneleri nasıl ele almalıyım?


13

Zar atmak için bir 3D fizik motoru yapıyorum. Şimdiye kadar bir zar 1x1x1m ve yerçekimi 9.82 m / s ^ 2 olmuştur. Bu elbette gerçekçi görünmüyor çünkü zar her şeye biraz yavaş görünecek şekilde cevap verecek.

Bunu düzeltmek için bir zarın yaklaşık 0.02m olması için tüm boyutları değiştirmeye çalıştım. Bu da ters kitlelerimi ve ters atalet matrislerimi sayısal dengesizliğe yol açan çok büyük değerler elde etti.

Bununla başa çıkmanın en iyi yolu nedir? Ölçeği 1x1x1 olacak şekilde hareket ettirebilir miyim ve sadece hareket kuvvetlerinin kütlesini veya boyutunu değiştirebilir miyim? Yoksa başka bir şey değiştirmeli miyim?

Uzay gemisi ya da benzeri bir şey gibi çok büyük fiziksel bedenlerle bir oyun yaptıysanız aynı problemin ortaya çıktığını tahmin ediyorum, bu yüzden umarım birisi daha önce benzer bir şeyle karşılaştı.


Burada uzman değilim, ama herhangi bir kod olmadan, sorunun ne olduğunu nasıl bilebiliriz? Muhtemelen yanılıyorum, çünkü Box2D aynı sorunları yaşıyor.
jcora

1
(Tüm oyları görünce, bunları kodlamanın geleneksel bir yolu olmalı ve insanlar neyin sorun olduğunu biliyor gibi görünüyor. Sanırım yanılmışım.)
jcora

1
Evet, bununla başa çıkmanın geleneksel bir yolu olabileceğini düşündüm. Gördüğüm gibi bu bir kod sorunu değil, sayısal hassasiyetle ilgili bir sorun. Ne sonra sorunumu çözmek için bir kod snippet değil, daha ziyade konuya bir yaklaşım açıklamasıdır.
Mikael Högström

Yani kayan nokta hassasiyeti?
jcora

Bir anlamda evet. Çarpışma işlemede kullandığım atalet matrisinin tersi çok büyük değerler alıyor. Pivot elemanlar büyük değerler aldıkça ve devam eden çok fazla ekleme olmadığından, aslında şartlı değildir, ancak simülasyon hızlı bir şekilde kontrolden çıktığında bir şekilde sayısal hassasiyetle ilgili bir sorun olmalıdır.
Mikael Högström

Yanıtlar:


1

Yapabilirdiniz

  • yerçekimi sabitini artırmak? Oyunlar genellikle 2 * 9.81 m / s ^ 2 kullanır. Bunu nerede okuduğumu hatırlayamıyorum, ancak oyunlar genellikle duyusal olmayan birimleri kullanıyor. Sabitler ne olursa olsun (oyunu eğlenceli hale getirin). Gerçekçi bir sabit kullanmak fiziğin yavaş ve değişken görünmesini sağlar.
  • simülasyonu daha hızlı çalıştırın. Sabit bir zaman çizelgesi kullanıyorsanız, animasyon oranı artar.
  • yüksek hassasiyetli yüzer kullan?

İkinci nokta, simülasyonu daha pürüzsüz hale getirmekten başka bir şey yapmaz, hatta simülasyon çok hızlı çalıştırılırsa bile kırılabilir (bunun gerçekçi bir sorun olup olmadığından emin değilim, ancak bir milisaniyeden önce dünya adımları atıyorsa, zaman fark her zaman 0 olur ve hiçbir şey işe yaramaz). Yüksek hassasiyetli şamandıralar üzerinde de bellek kaybetmek istemeyebilir.
jcora

1
Oyunlar genellikle çift ​​çekim kullanır mı? Kim söylüyor?
GameDev-er

Oranı veya doğruluğu değiştiremem ama yer çekimini değiştirmeyi deneyeceğim.
Mikael Högström

Yerçekimi sabitinin değiştirilmesi zarların daha hızlı hareket etmesini sağlar ve her şeyin daha küçük ölçekte olduğu izlenimini verir. Bu, kareler arası hızlanmayı idare edecek mikro çarpışmalarla bile davranışı daha gergin hale getirir. Sanırım sadece
ince

4

Küçük sayısal değerlerle ilgili sorun yaşıyorsanız, her şeyi basitçe ölçeklendirmenizi öneririm. Hatta "gerçek" ölçü birimlerini değil, sadece motorun içinde anlamlı olan bazı "genel" birimleri kullanabilirsiniz.

İlk seçenek, ölçeklendirme, temel ölçüm birimi olarak milimetre veya santimetre kullanmanızı gerektirir. Küpünüzün boyutları hassasiyet kaybı yaşamazdı.

İkinci çözüm temel olarak aynı şeydir, ancak o zaman gerçek birimleri düşünmeniz gerekmez.

Ayrıca neden küpün kütlesini değiştirmiyorsunuz?


Sahip olduğum tek kuvvet jeneratörleri yerçekimi / ivmeölçer tabanlı olduğu için kütleyi değiştirmek davranış değiştirmez. Ancak önerileriniz, küçük nesnelere daha büyük kütle vermek, ters kütlelerini birbirine yakınlaştırmak ve böylece sayısal dengesizliği azaltmak için başka bir şekilde de kullanılabilir (belki de demek istediniz). Bu, sadece yerçekimi sabitini arttırmakla aynı sorunları verir.
Mikael Högström


0

Soruna nihai çözümümü paylaşmam gerektiğini düşündüm. Yerçekimi sabitinin önerildiği gibi arttırılması, zarların daha hızlı hareket etmesini sağladı ve böylece doğru ölçek izlenimi verdi. Ancak bu, mikro-sıçrama sorunlarını artırdı. Sorunu mükemmel bir şekilde çözemese de, sorunu hafifleten mikro çarpışmalar ekledim. Bunun yalnızca "küçük" nesneler için bir sorun haline geldiğini ve ters sorunu yaşıyorsanız ve çok büyük nesneleri (uzay gemileri veya bunun gibi bir şey) simüle etmek istiyorsanız, o zaman herhangi bir mikro sıçan problemi yaşamayacaksınız ve bu çözüm.

Bu yüzden çok fazla "mikro-sıçrama" elde etmeden alabileceğim en yüksek ağırlık seviyesini buldum. Sonra telefonda ivmeölçer okumalarındaki büyük değişikliklere cevap veren basit bir sarsıntı algılama kullandım ve bu sarsıntılar algılandığında tüm nesnelere impuls uyguladı. Mükemmel değil ama telefon sallandığında zar hızlı hareket edecek gibi "küçük" zar bir izlenim verecektir. Bu biraz hack ama yapmak zorunda :) İşte eylem motorun bir klip .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.