{"id":474,"date":"2009-07-20T20:06:21","date_gmt":"2009-07-21T03:06:21","guid":{"rendered":"http:\/\/www.shultays.com\/blog\/?p=151"},"modified":"2009-07-20T20:06:21","modified_gmt":"2009-07-21T03:06:21","slug":"collision-detection-uzerine","status":"publish","type":"post","link":"https:\/\/enginmercan.com\/?p=474","title":{"rendered":"Collision Detection \u00dczerine"},"content":{"rendered":"<p>Biraz internette buldu\u011fum bir collision detection algoritmas\u0131 \u00fczerine bahsedece\u011fim. \u015eu sitede tan\u0131\u015ft\u0131m kendisi ile<\/p>\n<p><a href=\"http:\/\/spiritking.tripod.com\/cdtut.htm\">http:\/\/spiritking.tripod.com\/cdtut.htm<\/a><\/p>\n<p>Algoritma hareket eden insan\u0131 bir silindir olarak d\u00fc\u015f\u00fcn\u00fcyor. Mant\u0131k olarak \u00e7ok g\u00fczel d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f, performans\u0131da gayet iyi gibi duruyor. Lakin sitedeki implementation biraz kusurlu olmu\u015f ve algoritman\u0131n biraz eksi\u011fi var gibi.<\/p>\n<p>Collision detection i\u00e7in gerekli olan verilerimiz, kamera koordinat\u0131, silindirin alt ve \u00fcst s\u0131n\u0131rlar\u0131n\u0131n y koordinatlar\u0131 ve bir de silindirimizin yar\u0131 \u00e7ap\u0131. Ayr\u0131ca polygonlar\u0131m\u0131z\u0131n koordinatlar\u0131, normal leri laz\u0131m olacak.<\/p>\n<p>\u015eu resmi bir inceleyelim. (Yukar\u0131daki sayfada oldu\u011fu gibi benim program\u0131mda da y ekseni yukar\u0131s\u0131 olarak tan\u0131mlanm\u0131\u015f)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-152\" title=\"collision1\" src=\"http:\/\/www.shultays.com\/blog\/wp-content\/uploads\/2009\/07\/collision1.jpg\" alt=\"collision1\" width=\"619\" height=\"690\" \/><\/p>\n<p>Yukar\u0131daki resimde 3 tane polygonumuz var. Kamerada silindir ile g\u00f6sterilmi\u015f. En sa\u011fdaki polygon silindir ile collision yapm\u0131\u015f gibi duruyor (daha kolay anla\u015f\u0131lmas\u0131 i\u00e7in o \u00fc\u00e7geni hafif e\u011fimli bir duvar gibi d\u00fc\u015f\u00fcn\u00fcn bizde \u00fczerine do\u011fru y\u00fcr\u00fcm\u00fc\u015f\u00fcz) Sahnenin z y\u00f6n\u00fcnde bir kesini g\u00f6r\u00fcyoruz. Collision detectionun ilk a\u015famas\u0131 silindirin alt ve \u00fcst y\u00fczeylerinden ge\u00e7en 2 tane d\u00fczlem d\u00fc\u015f\u00fcn\u00fcn. B\u00fct\u00fcn polygonlar\u0131 bu iki d\u00fczlem aras\u0131nda kalan k\u0131s\u0131mlar\u0131n\u0131 kullan\u0131yoruz. Mesela soldaki polygon un hem \u00fcst\u00fcnden hem alt\u0131ndan kesmi\u015fiz ve sonu\u00e7ta silindirin y\u00fckseklik s\u0131n\u0131rlar\u0131nda kalan bir be\u015fgen ortaya \u00e7\u0131km\u0131\u015f.\u00a0 Ortadaki polygon tamam\u0131 iki d\u00fczlem aras\u0131nda kalm\u0131\u015f, o y\u00fczden bir kesintiye u\u011fram\u0131yor. Sa\u011fdakininde sadece alt k\u0131sm\u0131 kesilmi\u015f ve gene ortaya bir \u00fc\u00e7gen \u00e7\u0131km\u0131\u015f.(e\u011fer bir polygon bu iki d\u00fczlemin tamamen ters taraflar\u0131nda ise tamamen g\u00f6z ard\u0131 edilecekti)<\/p>\n<p>Ortadaki resim sadece polygonlar\u0131n kesildikten sonraki halini g\u00f6steriyor. G\u00f6rebilece\u011finiz gibi kesti\u011fimiz k\u0131s\u0131mlar\u0131n collision yapabilmesi imkans\u0131zd\u0131, sadece bu par\u00e7alar collision ihtimaline sahip.<\/p>\n<blockquote><p>Burada kesme i\u015fleminin nas\u0131l oldu\u011funu anlatay\u0131m. Verdi\u011fim sitedeki \u00f6rnekten biraz daha farkl\u0131 bir yol izledim, oradaki \u00f6rnek hatal\u0131 gibi geldi ve baz\u0131 durumlar\u0131 atlayabiliyordu.<\/p>\n<p>Kesme i\u015flemi alt ve \u00fcst s\u0131n\u0131r i\u00e7in iki kere yap\u0131l\u0131yor. her abc \u00fc\u00e7gen i\u00e7in abc \u00fc\u00e7geni i\u00e7in 3 tane do\u011fru par\u00e7am\u0131z var, ab bc ca. Her do\u011fru par\u00e7as\u0131 i\u00e7in \u015fu algoritmay\u0131 uyguluyoruz.<\/p>\n<ul>\n<li>E\u011fer her iki noktada do\u011fru tarafta ise, ikinci noktay\u0131 al.<\/li>\n<li>Birinci nokta do\u011fru, ikincisi yanl\u0131\u015f tarafta ise do\u011fru par\u00e7as\u0131n\u0131n s\u0131n\u0131r ile kesi\u015fti\u011fi yeri al.<\/li>\n<li>Birinci nokta yanl\u0131\u015f, ikincisi do\u011fru tarafta ise \u00f6nce do\u011fru par\u00e7as\u0131n\u0131n s\u0131n\u0131r ile kesi\u015fti\u011fi yerisonra ikinci noktay\u0131 al.<\/li>\n<li>Her iki noktada d\u0131\u015farda ise hi\u00e7 bir nokta alma.<\/li>\n<\/ul>\n<p>Bu algoritma sonucu ald\u0131\u011f\u0131m\u0131z noktalar \u00fc\u00e7genin plane in do\u011fru taraf\u0131nda kalan k\u0131sm\u0131 olmu\u015f oluyor. Mesela yukar\u0131daki resimde soldaki \u00fc\u00e7gen i\u00e7in<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-155\" title=\"collision21\" src=\"http:\/\/www.shultays.com\/blog\/wp-content\/uploads\/2009\/07\/collision21.jpg\" alt=\"collision21\" width=\"619\" height=\"409\" \/>\u00d6nce \u00fcst k\u0131s\u0131m i\u00e7in clip yap\u0131yoruz. a dan b ye giderken her iki noktada do\u011fru tarafta, sadece b al\u0131n\u0131yor. b den c ye giderken b i\u00e7erde c d\u0131\u015far\u0131da bc do\u011fru par\u00e7as\u0131 ile s\u0131n\u0131r\u0131n kesi\u015fti\u011fi yeri (bc&#8217;) al\u0131yoruz. c den tekrar a ya giderken ilk nokta yanl\u0131\u015f ikincisi do\u011fru yerde oldu\u011fu i\u00e7in kesi\u015fim noktas\u0131n\u0131 (ca&#8217;) ve sonra a y\u0131 al\u0131yor\u0131z. sonu\u00e7ta yeni olu\u015fan \u015fekil. b bc&#8217; ca&#8217; a d\u00f6rtgeni oluyor. ayn\u0131 i\u015flemi bu sefer alt s\u0131n\u0131r i\u00e7in yap\u0131yoruz ve sonu\u00e7ta bc&#8217; ca&#8217; a b(bc&#8217;)&#8217; ab&#8217; be\u015fgenini elde etmi\u015f oluyoruz. Bu algoritma sonucu elimizde en iyi ihtimalle 0 nokta\u00a0 (t\u00fcm noktalar d\u0131\u015far\u0131da ise) en k\u00f6t\u00fc ihtimallede bir be\u015fgen olu\u015facak.<\/p><\/blockquote>\n<p>En alttaki resim algoritman\u0131n g\u00fczel taraf\u0131n\u0131 g\u00f6steriyor. B\u00fct\u00fcn polygonlar\u0131 kestikten sonra bu sefer y ekseni y\u00f6n\u00fcnde bakam bir kesit ald\u0131\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcn. Her \u015fey iki boyuta iniyor ve silindirimiz bir \u00e7embere d\u00f6n\u00fc\u015f\u00fcyor. E\u011fer bu \u00e7ember i\u00e7inde kalan bir polygonumuz varsa bu onun silindir i\u00e7inde kald\u0131\u011f\u0131n\u0131 ve kamera ile \u00e7ar\u011f\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6steriyor!<\/p>\n<p>Peki 2 boyutlu d\u00fczlemde bir \u00e7ember ve do\u011fru par\u00e7as\u0131n\u0131n (art\u0131k \u015fekilleri do\u011fru par\u00e7as\u0131 array i olarka d\u00fc\u015f\u00fcnelim =) ) kesi\u015fti\u011fini nas\u0131l anlayaca\u011f\u0131z? Bunun i\u00e7in biraz vekt\u00f6r bilgisine ihtiya\u00e7 var. Sitede verilen \u00f6rnek program\u0131n bu k\u0131sm\u0131 d\u00fczg\u00fcn \u00e7al\u0131\u015f\u0131yor, a\u00e7\u0131klamas\u0131na \u015furadan bakabilirsiniz.<\/p>\n<p><a href=\"http:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/pointline\/\">http:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/pointline\/<\/a><\/p>\n<p>Burada farkl\u0131 olan tek \u015fey e\u011fer do\u011fru \u00fczerindeki nokta do\u011fru par\u00e7as\u0131 d\u0131\u015f\u0131nda ise biz o noktaya yak\u0131n olan s\u0131n\u0131r\u0131 al\u0131yoruz.<\/p>\n<p>E\u011fer \u00e7emberimiz \u015fekil ile kesi\u015fiyorsa ki\u015fiyi hareket ettirmek durumunda kal\u0131yoruz. Burada iki ihtimal var. Ya \u00fc\u00e7genimizin \u00fczerine t\u0131rman\u0131r\u0131z (e\u011fer e\u011fim uygun ise) veya silindiri \u00fc\u00e7gen ile kesi\u015fmiycek \u015fekilde uzakla\u015ft\u0131r\u0131r\u0131z.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-157\" title=\"collision31\" src=\"http:\/\/www.shultays.com\/blog\/wp-content\/uploads\/2009\/07\/collision31.jpg\" alt=\"collision31\" width=\"399\" height=\"199\" \/>\u0130kinci durum daha kolay olay\u0131, iki boyutta d\u00fc\u015f\u00fcn\u00fcrek halledebiliyoruz. E\u011fer aradaki uzakl\u0131k a ise, \u00e7emberi r &#8211; a kadar hareket ettiriyoruz ve sorun \u00e7\u00f6z\u00fcl\u00fcyor.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-158\" title=\"collision4\" src=\"http:\/\/www.shultays.com\/blog\/wp-content\/uploads\/2009\/07\/collision4.jpg\" alt=\"collision4\" width=\"352\" height=\"192\" \/>Birinci durumda (verdi\u011fim sitede yeterli anlat\u0131lmam\u0131\u015f, eksik kalm\u0131\u015f gibime geldi) ise i\u015fler biraz daha kar\u0131\u015f\u0131k. E\u011fer \u00fc\u00e7genin e\u011fimi uygun ise \u00fc\u00e7genin \u00fczerine t\u0131rmanmam\u0131z gerekiyor.\u00a0 \u00d6ncelikle \u00e7emberin kesi\u015fen nokta y\u00f6n\u00fcndeki u\u00e7 noktay\u0131 (a boktas\u0131) buluyoruz. Ama\u00e7 bu a noktas\u0131n\u0131 yeterince yukar\u0131 kald\u0131rmak b\u00f6ylece collision u engellemek. Bunun i\u00e7inde \u00fc\u00e7gen \u00fczerinde olan a&#8217; noktas\u0131n\u0131 bulmak laz\u0131m. Bunu bulmak i\u00e7inde \u015fu form\u00fcl\u00fc kulland\u0131m.<\/p>\n<p><a href=\"http:\/\/gpwiki.org\/index.php\/MathGem:Height_of_a_Point_in_a_Triangle\">http:\/\/gpwiki.org\/index.php\/MathGem:Height_of_a_Point_in_a_Triangle<\/a><\/p>\n<p>Bu linkte procedure k\u0131sm\u0131ndaki form\u00fcl ile a&#8217; noktas\u0131n\u0131 buluyoruz. Bu nokta \u00fc\u00e7gen \u00fczerinde ve a ile ayn\u0131 x-z koordinatlar\u0131na sahip (form\u00fclde z ve y harflerini de\u011fi\u015ftirin, bizim arad\u0131\u011f\u0131m\u0131z y). a&#8217; noktas\u0131n\u0131 bulduktan sonraa ile aras\u0131ndaki y\u00fckseklik fark\u0131n\u0131 buluyoruz ve silindirimizi o uzunlukta yukar\u0131 kald\u0131r\u0131yoruz.<\/p>\n<p>B\u00fct\u00fcn sorunlar\u0131 bu \u015fekilde \u00e7\u00f6zemiyoruz malesef. Bir di\u011fer problem ise tamamen yatay d\u00fczlemlerde olu\u015fuyor. Mesela y\u00fcksek bir noktadan d\u00fc\u015ft\u00fc\u011f\u00fcm\u00fcz\u00fc d\u00fc\u015f\u00fcn\u00fcn. Alt\u0131m\u0131zda ise b\u00fcy\u00fck bir \u00fc\u00e7gen var, bu \u00fc\u00e7gen bizim silindirimizin s\u0131n\u0131rlar\u0131na girdi\u011finde \u00fcstten g\u00f6r\u00fcn\u00fc\u015f \u015fu oluyor.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-159\" title=\"collision5\" src=\"http:\/\/www.shultays.com\/blog\/wp-content\/uploads\/2009\/07\/collision5.jpg\" alt=\"collision5\" width=\"286\" height=\"192\" \/>Burada dikkat ederseniz hi\u00e7 bir do\u011fru par\u00e7as\u0131 \u00e7ember ile kesi\u015fmiyor, ama yine de bir collision var. Bu durumu anlayabilmek i\u00e7in bir test daha gerekiyor. Bu testte \u00e7emberin merkezinin \u00fc\u00e7gen i\u00e7inde mi de\u011fil mi onu ar\u0131yoruz. Bunun i\u00e7in abc \u00fc\u00e7geni ve n noktas\u0131nda her do\u011fru par\u00e7as\u0131 i\u00e7in merkez ayn\u0131 tarafta m\u0131 kontrol ediyoruz. mesela ab do\u011fru par\u00e7as\u0131 i\u00e7in \u00f6nce an vekt\u00f6r\u00fcn\u00fc buluyoruz ve bunun dot product \u0131n\u0131 hesapl\u0131yoruz, ayn\u0131 i\u015flemi bc ve ca i\u00e7in de yap\u0131yoruz. E\u011fer b\u00fct\u00fcn dot product lar pozitif ise nokta \u00e7emberin i\u00e7inde demek oluyor. Bu durumda yine ayn\u0131 \u015fekilde silindiri bir par\u00e7a yukar\u0131 kald\u0131rarak sorunu \u00e7\u00f6z\u00fcyoruz. (\u015furada ayr\u0131nt\u0131 a\u00e7\u0131klama var <a href=\"http:\/\/www.blackpawn.com\/texts\/pointinpoly\/default.html\">http:\/\/www.blackpawn.com\/texts\/pointinpoly\/default.html<\/a>)<\/p>\n<p>Ama maalesef bu da yeterli olmuyor =) Bir di\u011fer (ve olduk\u00e7a b\u00fcy\u00fck bir sorun) ise e\u011fer \u00e7ok h\u0131zl\u0131 hareket ediyorsak ne olaca\u011f\u0131. Bu durumu hen\u00fcz programa eklemedim ama \u015fu \u015fekilde \u00e7\u00f6z\u00fclebilir. \u00d6nceki koordinat\u0131m\u0131zdan yeni koordinata bir do\u011fru par\u00e7as\u0131 \u00e7izdi\u011fimizde e\u011fer bu do\u011fru par\u00e7as\u0131 polygon ile kesi\u015fiyorsa collision oluyor demektir. Ama bu tam yeterli bir \u00e7\u00f6z\u00fcm de\u011fil o y\u00fczden hen\u00fcz eklemek istemedim. Akl\u0131ma daha iyi bir \u00e7\u00f6z\u00fcm geldi\u011finde onu eklemeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<p><a href=\"http:\/\/shultays.com\/collision.rar\">Program\u0131n son hali<\/a><\/p>\n<p><a href=\"http:\/\/shultays.com\/collision.src.rar\">Kaynak dosyalar\u0131<\/a><\/p>\n<p>(ek: f tu\u015funu bas\u0131l\u0131 tutarak u\u00e7abiliyorsunuz =D)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Biraz internette buldu\u011fum bir collision detection algoritmas\u0131 \u00fczerine bahsedece\u011fim. \u015eu sitede tan\u0131\u015ft\u0131m kendisi ile http:\/\/spiritking.tripod.com\/cdtut.htm Algoritma hareket eden insan\u0131 bir silindir olarak d\u00fc\u015f\u00fcn\u00fcyor. Mant\u0131k olarak \u00e7ok g\u00fczel d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f, performans\u0131da gayet iyi gibi duruyor. Lakin sitedeki implementation biraz kusurlu olmu\u015f ve algoritman\u0131n biraz eksi\u011fi var gibi. Collision detection i\u00e7in gerekli olan verilerimiz, kamera koordinat\u0131, silindirin alt [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,10,15,12,1],"tags":[],"class_list":["post-474","post","type-post","status-publish","format-standard","hentry","category-algoritma","category-cc","category-directx","category-grafik","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/posts\/474","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/enginmercan.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=474"}],"version-history":[{"count":0,"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/posts\/474\/revisions"}],"wp:attachment":[{"href":"https:\/\/enginmercan.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=474"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/enginmercan.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=474"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/enginmercan.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=474"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}