Şimdi Ara

Geometri, Fizik, C#, Matematik

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
16
Cevap
0
Favori
939
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
Öne Çıkar
0 oy
Sayfa: 1
Giriş
Mesaj
  • Merhaba, amatör oyun programlama için kendi fizik motorcuğumu geliştiriyorum, henüz çarpışma kontrol noktasındayım. Geldiğim noktadaki sıkıntımı paylaşayım;
    Şekillerin çarpışması, bu noktada şekillerin kenarları birbirinin içine geçtiyse bunu bulmak kolay, ama bir şeklin tamamen içinde olan şekilleri algılamak için şöyle bir şey yapmanız gerekli;
    Bir şeklin herhangi bir noktası diğer şeklin içindeyse, bu iki şekil çapışıyor demektir.
    Tabii bir noktanın bir şeklin içinde olup olmadığını kontrol eden bir mekanizma yok.
    Ama bir şeklin bir üçgenin içinde olup olmadığını nasıl kontrol edeceğimi biliyorum. (Doğruları kullanarak)
    Sonuçta bütün şekilleri üçgenlere ayırıp yapacağım bu işi;

    Dışbükey çokgenlerde bu epey kolay oluyor, bir noktadan başlıyorsunuz, iki komşu köşesi ve kendisi hariç tüm noktalara birer çizgi çektinizmi, n kenarlı çokgen n-2 tane üçgene ayrılmış oluyor.
    Ama içbükey çokgenlerde bu kural işlemiyor,
    Bunun için bir algoritma kurdum, henüz test edemedim dershane falan filan. Test edeceğim ama önce bu konuda bilginiz var mı diye sormak istedim, Amerikayı yeniden keşfetmeye gerek yok.
    Algoritmam (Normal algoritma değil sadece sıralı söz dizimi) şu şekilde ilerliyor; (Bu arada, parametre olarak Nokta dizisi alıyoruz,
    1-Bir dizi kenar (İki nokta içeren bir sınıf) tanımlanır.
    2-kenar dizisine şeklin bütün kenarları atılır (n tane nokta için n tane kenar, for döngüsü ile oluşturulur)
    3-Şeklin köşe nokta sayısı - 2 kere 4'e git;
    4- 3'ten gelen index'e ait nokta için;
    index-1 (index 0 ise burası şeklin köşe sayısı, yani son noktası olacak) ,index ve index+1(index sonda ise burası 0, yani ilk nokta olacak) hariç, şeklin tüm noktaları için 5'e git (index2);
    5-Gelen iki nokta (index, index2) 'dan bir doğru parçası oluştur, Bu doğru parçası, ilk adımda oluşturduğumuz kenar dizisinden herhangi birinin İÇİNDEN GEÇİYORSA (uç uca olmaması gerek) İPTAL, Hiçbirinin içinden geçmiyorsa;
    Yeni doğru parçasını, sanki şeklin bir kenarıymış gibi yukarıdaki diziye ekle. Bu nokta için iş bitti.

    Bu adımlar sonlandığında elimizde;
    -Bir tane ana şekil, n kenarlı.
    -İçinde n-2 tane üçgen.
    -Dışta n tane kenar, içinde ise n-3 tane üçgen oluşturmak için kullanılan doğru parçaları.
    -Yani toplamda n-2 üçgen, (n+n-3) 2n - 3 tane doğru parçası var.

    Yapmadığım şey ise;
    Bu kenarlardan üçgen oluşturmak, onun için de ayrı bir algoritma yazdım ama boşu boşuna uzattığımı düşünüyorum.
    Sorduğum şey ise, yukarıdaki algoritmada, bir kenar çizildiğinde MÜMKÜNSE hemen üçgeni oluşturup bir kenara (yine bir dizi olabilir), atmak.

    Sizce yukarıdaki algoritma da bunu nasıl yaparım? Herkese kolay gelsin, şimdiden teşekkür ediyorum.



    _____________________________
  • Eğer trigger mekanizması yapmayacak isen bunun için uğraşma. Zaten yazılımı yaparken hiç kimse iki tane rigidbody'yi içi içe ya da bir rigidbody'i trianglemesh'in içine yerleştirip simulasyon yapmaya çalışmaz. Yaptığında ise saçma sapan bir simulasyon ortaya çıkar. Tüm fizik motorlarında bu böyledir (En azından benim test ettiklerimde physx,bullet). Ama eğer bir objenin başka bir objenin içinde olup olmadığını test ediceksen(collision detection değil) o zaman iş başka. Muhakkak formulü vardır nette doğru araştırman gerekli.
    Biraz tuzlu olmakla birlikte şu kitabı tavsiye edebilirim : http://www.amazon.com/Physics-Development-Kaufmann-Interactive-Technology/dp/012369471X
    İyi çalışmalar.



    < Bu mesaj bu kişi tarafından değiştirildi hasan1980125 -- 2 Eylül 2012; 21:56:04 >
    _____________________________




  • quote:

    Orijinalden alıntı: hasan1980125

    Eğer trigger mekanizması yapmayacak isen bunun için uğraşma. Zaten yazılımı yaparken hiç kimse iki tane rigidbody'yi içi içe ya da bir rigidbody'i trianglemesh'in içine yerleştirip simulasyon yapmaya çalışmaz. Yaptığında ise saçma sapan bir simulasyon ortaya çıkar. Tüm fizik motorlarında bu böyledir (En azından benim test ettiklerimde physx,bullet). Ama eğer bir objenin başka bir objenin içinde olup olmadığını test ediceksen(collision detection değil) o zaman iş başka. Muhakkak formulü vardır nette doğru araştırman gerekli.
    Biraz tuzlu olmakla birlikte şu kitabı tavsiye edebilirim : http://www.amazon.com/Physics-Development-Kaufmann-Interactive-Technology/dp/012369471X
    İyi çalışmalar.

    Çok teşekkür ederim, aslında bu projenin amacı oyunlara katmak değil (Öyle olması için profesyonel olmam, birkaç kişiden yardım almam gerekirdi), kendimi geliştirmek ve biraz da görsel zevk katmak. Zaten 2 boyutlu çalışıyorum, Ya işte ben üçgeni tutup fırlatıcam orda gidip bir yere çarpcak moment falan filan yapmaya çalışacağım, sırf eğlence yani, ama dediğiniz gibi muhtemelen biraz fazlasını yapmaya çalışıyorum o da olmuyor işte :)
    _____________________________




  • Projeye başlamadan önce ufak bi literatür taraması çok işine yarayacaktır. Mesela hali hazırdaki fizik motorlarını inceleyebilirsin. Aralarında açık kaynak kodlu olanlarıda var, olmayanlarıda. En azından nasıl çalıştıklarını api'de hangi sınıflar nasıl işliyor vs.. malumatın olur. Örneğin box2d (2d yapıyorum dediğin için) 'yi indirip bi kaç ufak test yapabilirsin.
    Kolay gelsin.
    _____________________________
  • 2d collision ise pixel perfect collision uygulayabilirsin. ve hep değil, sadece adım atıldığında, location değişikliğinde bu kontrolü yaparsın. şahsen yaptığım için söylüyorum, c++ gibi memory ile direkt ilgilendiğimiz dillerde bellekteki grafiğe ulaşmak en ufak performans kaybına uğratmaz.
    _____________________________
  • quote:

    Orijinalden alıntı: artariel

    2d collision ise pixel perfect collision uygulayabilirsin. ve hep değil, sadece adım atıldığında, location değişikliğinde bu kontrolü yaparsın. şahsen yaptığım için söylüyorum, c++ gibi memory ile direkt ilgilendiğimiz dillerde bellekteki grafiğe ulaşmak en ufak performans kaybına uğratmaz.

    Pixel collision, anladığım kadarıyla tüm nesneleri pixel pixel tarıyor, örneğin a nesnesinin herhangi bir pixeli diğer tüm nesnelerin, herhangi bir pixeli ile aynı koordinattaysa çarpışma var demektir. Bununla ilgili de, bitmapi bu formata getirmeyle ilgili bir projem vardı, bir deneyelim bakalım. Teşekkürler.

    hasan1980125
    O Box2D'yi youtubeda bi videoda görmüştüm sanırım, epey güzel duruyordu, deneyeceğim, teşekkürler.
    _____________________________
  • performans açısından ipuçları şöyle verebilirim, pixel transparanlığı 0 ise, collision aramayacan, nesnenin ortalama büyüklüğü içinde olmayan nesneleri taramayacan. yoksa başın ağrır
    _____________________________
  • Yapay Zeka’dan İlgili Konular
    Meb fizik kimya
    10 yıl önce açıldı
    tyt fizik
    3 yıl önce açıldı
    ayt fizik
    7 yıl önce açıldı
    Daha Fazla Göster
  • quote:

    Orijinalden alıntı: hasan1980125

    Eğer trigger mekanizması yapmayacak isen bunun için uğraşma. Zaten yazılımı yaparken hiç kimse iki tane rigidbody'yi içi içe ya da bir rigidbody'i trianglemesh'in içine yerleştirip simulasyon yapmaya çalışmaz. Yaptığında ise saçma sapan bir simulasyon ortaya çıkar. Tüm fizik motorlarında bu böyledir (En azından benim test ettiklerimde physx,bullet). Ama eğer bir objenin başka bir objenin içinde olup olmadığını test ediceksen(collision detection değil) o zaman iş başka. Muhakkak formulü vardır nette doğru araştırman gerekli.
    Biraz tuzlu olmakla birlikte şu kitabı tavsiye edebilirim : http://www.amazon.com/Physics-Development-Kaufmann-Interactive-Technology/dp/012369471X
    İyi çalışmalar.

    Bir nesnenin içinde olması da collision olması lazım, aksi takdirde saçma saçma buglar çıkar. Ha belki aynı yöntemle tespit edilmiyordur, mesela benim programım nesnelerin iç içe olmasını ŞUAN İÇİN algılamıyor;
    VİDEO
    Ama algılaması gerek. Yukarıda yazdığım algoritma zaten bunun için, nesnelerin normal çarpışması (Sizin bahsettiğiniz, Topa vurmak, kurşunun duvara çarpması vb.) bunları algılamak için, nesnelerin kenarlarıyla ilgili bir algoritmam var. Ama tabii ki iç içe olan nesnelerin, kenarları da birbirine çarpmadığı için bulunmuyor :), kolay gelsin.
    _____________________________




  • quote:

    Orijinalden alıntı: artariel

    performans açısından ipuçları şöyle verebilirim, pixel transparanlığı 0 ise, collision aramayacan, nesnenin ortalama büyüklüğü içinde olmayan nesneleri taramayacan. yoksa başın ağrır

    Bir üçgeni nasıl pixellere ayırırız? Benim bu konudaki düşüncem şu şekilde;
    Bir bitmap nesnesi oluşturulur (Bitmapin boyutu, istenen nesnenin çevre dörtgeni kadardır [Bunu bulan algoritmam da var.]), Tüm pixeller transparent yapılır, istenen nesnenin (örnek için bir üçgen olsun), bitmape tek bir renkte olmak üzere polygon olarak boyanır. Şimdi elimizde, arkası transparent, şeklin kendisi de tümü bir renk olmak üzere bir bitmap var. Artık pixellere ayrılmış bir nesnemiz var.

    Bundan daha hızlı bir algoritma var mı? Veya hazırda bulunan birilerinin yaptığı bir sınıf?
    _____________________________




  • quote:

    Orijinalden alıntı: welrocken

    quote:

    Orijinalden alıntı: artariel

    performans açısından ipuçları şöyle verebilirim, pixel transparanlığı 0 ise, collision aramayacan, nesnenin ortalama büyüklüğü içinde olmayan nesneleri taramayacan. yoksa başın ağrır

    Bir üçgeni nasıl pixellere ayırırız? Benim bu konudaki düşüncem şu şekilde;
    Bir bitmap nesnesi oluşturulur (Bitmapin boyutu, istenen nesnenin çevre dörtgeni kadardır [Bunu bulan algoritmam da var.]), Tüm pixeller transparent yapılır, istenen nesnenin (örnek için bir üçgen olsun), bitmape tek bir renkte olmak üzere polygon olarak boyanır. Şimdi elimizde, arkası transparent, şeklin kendisi de tümü bir renk olmak üzere bir bitmap var. Artık pixellere ayrılmış bir nesnemiz var.

    Bundan daha hızlı bir algoritma var mı? Veya hazırda bulunan birilerinin yaptığı bir sınıf?

    directxle veya opengl ile çalışıyorsan zaten yüklediğin bitmape lockbuffer çekip pixelleriyle oynayabiliyor olman lazım. %100 transparan pixel, collisiona dahil edilmeyecek şekilde yaparsın. sonuçta ne şekil olursa olsun resim dosyaları kare sınırlar içerisindedir. bi öneri olarak da her grafiğin için bir collision mask, bitmask oluşturabilirsin. yani transparan yerlere 0, rengi olan yerlere 1 koyarak. bit karşılaştırması yapmak daha hızlı ve akıllıca olabilir. hatta bunun için 2'nin üsleri boyutunda olan grafikler seçersen, işlemciye yardımcı olabilirsin.
    _____________________________




  • quote:

    Orijinalden alıntı: artariel

    quote:

    Orijinalden alıntı: welrocken

    quote:

    Orijinalden alıntı: artariel

    performans açısından ipuçları şöyle verebilirim, pixel transparanlığı 0 ise, collision aramayacan, nesnenin ortalama büyüklüğü içinde olmayan nesneleri taramayacan. yoksa başın ağrır

    Bir üçgeni nasıl pixellere ayırırız? Benim bu konudaki düşüncem şu şekilde;
    Bir bitmap nesnesi oluşturulur (Bitmapin boyutu, istenen nesnenin çevre dörtgeni kadardır [Bunu bulan algoritmam da var.]), Tüm pixeller transparent yapılır, istenen nesnenin (örnek için bir üçgen olsun), bitmape tek bir renkte olmak üzere polygon olarak boyanır. Şimdi elimizde, arkası transparent, şeklin kendisi de tümü bir renk olmak üzere bir bitmap var. Artık pixellere ayrılmış bir nesnemiz var.

    Bundan daha hızlı bir algoritma var mı? Veya hazırda bulunan birilerinin yaptığı bir sınıf?

    directxle veya opengl ile çalışıyorsan zaten yüklediğin bitmape lockbuffer çekip pixelleriyle oynayabiliyor olman lazım. %100 transparan pixel, collisiona dahil edilmeyecek şekilde yaparsın. sonuçta ne şekil olursa olsun resim dosyaları kare sınırlar içerisindedir. bi öneri olarak da her grafiğin için bir collision mask, bitmask oluşturabilirsin. yani transparan yerlere 0, rengi olan yerlere 1 koyarak. bit karşılaştırması yapmak daha hızlı ve akıllıca olabilir. hatta bunun için 2'nin üsleri boyutunda olan grafikler seçersen, işlemciye yardımcı olabilirsin.

    "DirectX - Visual C# Express 2010" Bu ikili ile ilgili bir sorun var sanırım, veya ben beceremedim. DirectX dll'ini projeme çağırıyorum fakat, program derlendikten sonra DirectX'in initialize'ını kabul etmiyor, program çalışmıyor. Bu yüzden System.Drawing kütüphanesi kullanıyorum. Şekli (Polygon, noktalar dizisi) bitmape çevirmek için de şöyle birşey yazdım;

    public Bitmap SekildenBitmape(List<Nokta> noktalar) 
    {
    RectangleF dortgen = CevreDikdortgeni(noktalar);
    Bitmap bitmap = new Bitmap((int)(dortgen.Width), (int)(dortgen.Height));
    Graphics gecici = Graphics.FromImage(bitmap);
    gecici.FillRectangle(Brushes.Transparent, new RectangleF(0, 0, bitmap.Width, bitmap.Height));
    gecici.FillPolygon(Brushes.Red, noktalar);
    return bitmap;
    }

    public RectangleF CevreDikdortgeni(List<PointF> noktalar)
    {
    RectangleF theRect = new RectangleF(0, 0, 0, 0);
    if (noktalar.Count > 0)
    {
    float _X = noktalar[0].X;
    float _W = noktalar[0].X;
    float _Y = noktalar[0].Y;
    float _H = noktalar[0].Y;
    foreach (PointF item in noktalar)
    {
    PointF nokta = new PointF(item.X, item.Y);
    if (nokta.X < _X)
    {
    _X = nokta.X;
    }
    if (nokta.X > _W)
    {
    _W = nokta.X;
    }
    if (nokta.Y < _Y)
    {
    _Y = nokta.Y;
    }
    if (nokta.Y > _H)
    {
    _H = nokta.Y;
    }
    }
    theRect = new RectangleF(_X, _Y, _W - _X, _H - _Y);
    }
    return theRect;
    }
    _____________________________




  • quote:

    Orijinalden alıntı: welrocken

    quote:

    Orijinalden alıntı: hasan1980125

    Eğer trigger mekanizması yapmayacak isen bunun için uğraşma. Zaten yazılımı yaparken hiç kimse iki tane rigidbody'yi içi içe ya da bir rigidbody'i trianglemesh'in içine yerleştirip simulasyon yapmaya çalışmaz. Yaptığında ise saçma sapan bir simulasyon ortaya çıkar. Tüm fizik motorlarında bu böyledir (En azından benim test ettiklerimde physx,bullet). Ama eğer bir objenin başka bir objenin içinde olup olmadığını test ediceksen(collision detection değil) o zaman iş başka. Muhakkak formulü vardır nette doğru araştırman gerekli.
    Biraz tuzlu olmakla birlikte şu kitabı tavsiye edebilirim : http://www.amazon.com/Physics-Development-Kaufmann-Interactive-Technology/dp/012369471X
    İyi çalışmalar.

    Bir nesnenin içinde olması da collision olması lazım, aksi takdirde saçma saçma buglar çıkar. Ha belki aynı yöntemle tespit edilmiyordur, mesela benim programım nesnelerin iç içe olmasını ŞUAN İÇİN algılamıyor;
    VİDEO
    Ama algılaması gerek. Yukarıda yazdığım algoritma zaten bunun için, nesnelerin normal çarpışması (Sizin bahsettiğiniz, Topa vurmak, kurşunun duvara çarpması vb.) bunları algılamak için, nesnelerin kenarlarıyla ilgili bir algoritmam var. Ama tabii ki iç içe olan nesnelerin, kenarları da birbirine çarpmadığı için bulunmuyor :), kolay gelsin.

    Evet hata oluyor zaten. İki objeyi (static'ler hariç) birbirlerinin içinde spawn ettiğimde istenmeyen davranışlar sergiliyor. Objelerin uçuşması, birden kaybolması vs..
    Eğer yapmak istediğin tam olarak vidyodaki gibi ise üçgenin 3 noktasının birden kutunun içinde olup olmadığını test et.



    < Bu mesaj bu kişi tarafından değiştirildi hasan1980125 -- 4 Eylül 2012; 19:12:20 >
    _____________________________




  • quote:

    Orijinalden alıntı: hasan1980125

    quote:

    Orijinalden alıntı: welrocken

    quote:

    Orijinalden alıntı: hasan1980125

    Eğer trigger mekanizması yapmayacak isen bunun için uğraşma. Zaten yazılımı yaparken hiç kimse iki tane rigidbody'yi içi içe ya da bir rigidbody'i trianglemesh'in içine yerleştirip simulasyon yapmaya çalışmaz. Yaptığında ise saçma sapan bir simulasyon ortaya çıkar. Tüm fizik motorlarında bu böyledir (En azından benim test ettiklerimde physx,bullet). Ama eğer bir objenin başka bir objenin içinde olup olmadığını test ediceksen(collision detection değil) o zaman iş başka. Muhakkak formulü vardır nette doğru araştırman gerekli.
    Biraz tuzlu olmakla birlikte şu kitabı tavsiye edebilirim : http://www.amazon.com/Physics-Development-Kaufmann-Interactive-Technology/dp/012369471X
    İyi çalışmalar.

    Bir nesnenin içinde olması da collision olması lazım, aksi takdirde saçma saçma buglar çıkar. Ha belki aynı yöntemle tespit edilmiyordur, mesela benim programım nesnelerin iç içe olmasını ŞUAN İÇİN algılamıyor;
    VİDEO
    Ama algılaması gerek. Yukarıda yazdığım algoritma zaten bunun için, nesnelerin normal çarpışması (Sizin bahsettiğiniz, Topa vurmak, kurşunun duvara çarpması vb.) bunları algılamak için, nesnelerin kenarlarıyla ilgili bir algoritmam var. Ama tabii ki iç içe olan nesnelerin, kenarları da birbirine çarpmadığı için bulunmuyor :), kolay gelsin.

    Evet hata oluyor zaten. İki objeyi (static'ler hariç) birbirlerinin içinde spawn ettiğimde istenmeyen davranışlar sergiliyor. Objelerin uçuşması, birden kaybolması vs..
    Eğer yapmak istediğin tam olarak vidyodaki gibi ise üçgenin 3 noktasının birden kutunun içinde olup olmadığını test et.

    Amacım o, şuan noktaların şekillere göre konumları (iç, dış) olayıyla ilgili biraz geometri yardıracağım, umarım bulurum bişeyler, teşekkürler.
    _____________________________




  • _____________________________
  • quote:

    Orijinalden alıntı: hasan1980125

    Şuraya bi göz gezdirir misin? : http://www.oyungelistirici.org/phpBB3/viewtopic.php?f=16&t=10557

    Rectangle collision'ı biliyorum ya, adamın yazdığı programa mı bakayım? Benim programım rectangle'ı falan geçti, benim için asıl sorun içbükey şekiller, veya resimler (mesela bir çubuk adam içbükey bir şekil)
    _____________________________
  • quote:

    Orijinalden alıntı: hasan1980125

    Şuraya bi göz gezdirir misin? : http://www.oyungelistirici.org/phpBB3/viewtopic.php?f=16&t=10557

    http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm
    sanırım bu link işimi görecek çok sağolun, sonuçlar ve göz alıcı bir video ile tekrar gelmeye çalışacağım, kolay gelsin, saygılar.
    _____________________________




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.