29 Eylül 2009 Salı

Yeni Blog

artık bu blog'a daha fazla yazı eklemeyeceğim, onun yerine başka bir blog başlattım. Bu blogdaki tüm yazılar orada da var. Aslında devamı gibi. Yeni blogum artık hem ingilizce hem de türkçe olacak. Çok az post olmasından dolayı şu an için ingilizcesine ulaşılamıyor ama zaman içerisinde o da çalışır hale gelicektir. Hemen gitmek için;
Sonradan gelen düzenleme;
Sürekli güncellemeydi, spamdi derken blog'umu tekrar blogspot'a taşımış bulunmaktayım.

5 Eylül 2009 Cumartesi

Yol Bulma (Path Finding)

İnternette path finding ile ilgili bir makale okudum, önemli birkaç konuya değiniyordu, bu yüzden ben de bu makaleyi biraz özetleyerek türkçe olarak aktarmaya karar verdim. Umarım yardımcı olur. Bu makalenin orjinalini bu adreste bulabilirsiniz.

Oyunlarda hala yol bulma ile ilgili ciddi problemler bulunmaktadır, aşağıdaki video'da çeşitli oyunlardaki çeşitli hatalar gösterilmiştir.


Video'da görüldüğü gibi, bir çok oyundaki yol bulma algoritmaları her durumda doğru sonuç vermemektedir. Ancak bu sorunların çoğu, yol bulma işleminin way-point'ler ile hesaplanmasından kaynaklanmaktadır.

(Waypoint, gezilebilinen alanları tanımlamak için konan noktalardır. Buna 'yol noktaları' diyebiliriz.)

Waypoint'ler Neden Yol Bulmak için Uygun Değildir ?

Aşağıda tipik bir waypoint örneği bulunmakta.

Stormwind
[World of Warcraft'daki Stormwind City]

Stormwind_waypoints
[Waypointlerin konulmuş hali]

Gezilebilir alanları (yolları) way-pointlerle belirtebildiğimiz gibi konveks poligonlarla da ifade edebiliriz. Bu AI'a yol hakkında daha fazla bilgi ve daha düzgün karar verme olanağı verir. Bu şekildeki geometriler "navigation mesh" olarak adlandırılmıştır.

Stormwind-NavMesh

1. Bazı alanlarda, çok yüksek miktarda waypoint kullanmamız gerekebilir.

Geniş, açık alanlarda, AI'ın düzgün bir hareket yakalaması için çok fazla poligon gerekebilir.

Aşağıdaki resim, World of Warcraft'taki "Halaa" ismindeki kasabadan. NPC'lerin açık kısımlarda rahatça hareket etmesi isteniyor.

Halaa

Açık alanlar için çok fazla waypoint koymamız gerekiyor. Ancak bu sayı bile yeterli değil, waypointlerimizi daha da arttırmazsak, karakterlerimiz hareket ederken zig-zaglar çizerek ilerleyecektir.

Halaa_waypoints2

Diğer yandan, navigation mesh ile tanımlama yaparsak, çok daha az poligon kullanarak işimizi bitirmiş oluruz.

Halaa_navmesh2

Bu sayede daha az arama yaparak, yol bulma işleminin hızını da arttırabilirisiniz.

2. Karakterler ilerlerken zig-zaglar çizerek ilerleyebilir.

Waypoint'ler belirlediğiniz zaman, karakteriniz bu waypointlerin üzerinde hareket edecektir. Bu yüzden, büyük ihtimalle seçtiğiniz herhangi iki nokta arasında, düzgün waypointler bulunmayacağından, karakteriniz zig-zaglar çizerek hareket edecektir.

Karakterimizin A'dan B'ye gittiğiniz düşünelim.

Halaa_ab

Burada da sarı ile gösterilmiş olan yol, A'dan B'ye giden en ideal waypoint'leri göstermektedir.

Halaa_waypoints2_AB

Bu noktalar ile daha yumuşak olarak bir eğri oluşturmayı da düşünebilirsiniz, fakat waypointler etrafındaki objelerle ilgili bir bilgi barındırmadığından, eğrinin istenmeyen bir noktadan geçip geçmeyeceğini hesaplamanız zor olabilir.

Ancak, navigation mesh kullansaydık, en doğru yolu bulmamız daha kolay olacaktı. Aşağıda ise aynı işlemin navigation mesh ile yapılmış hali bulunmakta.

Halaa_navmesh2_AB

Bu durumda ise, karakterlerin dolaşabileceği alanın tümünü bildiğimizden dolayı, hesapladığımız yolu istediğimiz gibi yumuşatabiliriz. Aynı şekilde, aşağıdaki resimde, kırmızı olarak işaretlenen yol waypoint kullanıldığında ortaya çıkarken, mavi ile gösterilen yol ise navigation mesh kullandığımızda oluşturuluyor. (Tabii ki mavi olan yol programcının kullandığı algoritmaya göre değişir.)

Stormwind-NavMesh-with_splines

3. Waypointler kullandığımızda yolu, dinamik olarak değişen çevreye göre, değiştirmemiz daha zordur.

Eğer çevre dinamik olarak değişiyorsa ve sizin o bölgede yeterli sayıda waypointiniz yoksa, yol bulma işlemi başarısız olabilir. Aşağıdaki resimde yol üzerinde bir kutu olduğunu düşünelim. Bu durumda çok az waypoint bulunduğundan, karakter kutunun yanından düzgün bir şekilde dolaşamayacaktır.

Stormwind_waypoints_and_crate

Ancak, navigation mesh kullanırsak, çevre hakkında da bilgi sahibi olduğumuzdan, çeşitli yöntemlerle daha uygun bir yol bulabiliriz.

Stormwind-NavMesh-avoidance-cropped

4. Waypoint'ler farklı hareket tipleri olan karakterler için düzgün sonuç vermez.

Genişliği, yüksekliği, dönüş şekli ve bunun gibi bir çok parametrenin değiştiği durumlarda waypoint sistemi düzgün çalışmayabilir. Örnek olarak, aşağıdaki resimde bir panzer ile bir kişinin olduğunu düşünelim. Kişi, kum torbalarının yanından kolaylıkla yürüken, bir panzer bunu yapamaz.

bf42_piece

Kırmızı çizgi kişinin, mavi çizgi ise panzerin yolunu göstermektedir.

bf42_piece_paths

Waypoint'lerin düzgün çalışması için farklı waypoint grupları belirtebilirsiniz. Ancak bu işlem çok vakit isteyebilir. Bunların yanında waypointleri birleştirip panzerin nerede dolaşabileceğini hesaplayabilirsiniz ki, bu durumda waypointlerinizle bir navigation mesh oluşturmuş olursunuz.

bf42_piece_mesh

Yukarıdaki resimde gördüğünüz gibi, gezilebilinen alanların köşeleri belirli. Bu durumda, her farklı karakteriniz için bir yarıçap belirtebilirsiniz. Örnek olarak bir kişinin yarıçapı 1m, panzerin ise 5m olarak belirlenebilir.

bf42_piece_mesh_with_extents

Aynı zamanda farklı tipte karakterler için farklı hareket stilleri belirtebilirsiniz. Örnek olarak bir motorsiklet köşeleri daha yuvarlak alırken, bir insan köşeli dönüşler yapabilir.

motorcycle

Yukarıdaki resimde, motorsiklet kırmızı yolu izleyebilirken, sarı yolu izleyemez.

5. Waypointler karakterlerinizin, yol bulma dışındaki işlemleri için yeterli veri barındırmaz.

Bazı zamanlarda, yol bulma için kullanılan verilerin, AI'a nasıl davranacağını veya hareket edeceğini hesaplamada yardım etmesi gerekir. Örnek olarak bir karakterin belirli bir yola değilde, bir düşmana göre yer değiştirdiğini düşünelim. Bir canavar tarafından kovalanan köylü, kendine göre bir algoritmayla kaçmaya başlayacaktır. Eğer siz waypoint kullandıysanız, karakteriniz bu waypointleri kullanarak sağa sola koşamaz veya atlayamaz. Bu durum navigation mesh ile giderilebilir. Yani her nokta için, o noktanın uygun olup olmadığını hesaplayabilirsiniz. Bu işi, fizik motorunuz da sizin yerinize yapabilir, ancak navigation mesh kullanarak daha az sistem kaynağı tüketen bir AI sistemi yazabilirsiniz.

swordsman2

Hala ikna olmayanlar, makalenin orjinalinde yer alan soru/cevap kısmını inceleyebilirsiniz. http://www.ai-blog.net/archives/000152.html

29 Ağustos 2009 Cumartesi

Video Oyunları Orkestrası - Video Games Orchestra

GDnet'in facebook sayfasında karşılaştım, böyle bir orkestra varmış. Youtube sayfalarını da inceledim, eski oyunları oynamışlığınız varsa kesinlikle bir ara ziyaret etmelisiniz. Hepsini izlemek isterseniz http://www.youtube.com/user/VGOOnline#play/all adresine tıklayınız. Bende birkaç tane seçtim sizin için, iyi seyirler :)

Super Mario Medley (5/8/2009 @ IGC East '09)


Donkey Kong Medley (3/5/2009 @ BPC) Laptop hoparlörleri ile dinliyorsanız pek bişey duyamayabilirsiniz.


Super Mario Galaxy: Wind Garden (5/8/2009 @ IGC East '09)



Chrono Trigger Medley (5/8/2009 @ IGC East '09)


Linkler
Anasayfa:
http://www.vgo-online.org/
Youtube Sayfası:
http://www.youtube.com/user/VGOOnline#play/all

9 Ağustos 2009 Pazar

Bilgisayarın IP'sinden Bağlandığı Ülke Nasıl Bulunur ?

Web sitenize giren kullanıcıların hangi ülkeden bağlandığını öğrenmek isteyebilirsiniz, böylelikle onlara uygun bir sayfa veya karşılama metni gösterebilirsiniz. Bu yazıda, geo ip veritabanı kullanarak, bunu nasıl yapılacağını anlatacağım.

Öncelikle işe veritabanı için gerekli csv dosyasını indirmekle başlıyoruz. Csv dosyasını http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip adresinden indirebilirsiniz.

İndirme işlemi tamamlandıktan sonra, bu dosyayı uygun bir veritabanına aktarmamız gerekiyor. Herhangi bir veritabanı oluşturun, ya da hali hazırdaki bir veritabanını kullanın. Daha sonra bu veritabanında bir tablo yaratın. Bu tablonun ismi 'geoip' olabilir. Uygun bir tablo oluşturmak için, aşağıdaki kodu çalıştırabilirsiniz.

CREATE TABLE IF NOT EXISTS `geoip` (
`start_ip` char(15) NOT NULL,
`end_ip` char(15) NOT NULL,
`start` int(10) unsigned NOT NULL,
`end` int(10) unsigned NOT NULL,
`cc` char(2) NOT NULL,
`cn` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Şimdi bu tabloya, indirdiğimiz csv'deki verileri yükleyeceğiz. Bunun için, indirdiğiniz csv dosyasının yerini bilmeniz gerekiyor. Aşağıdaki SQL sorgusunu

çalıştırdığınızda csv dosyası veritabanına yüklenecektir.

LOAD DATA LOCAL INFILE [dosyanın yolu] INTO TABLE [tablo adı] FIELDS TERMINATED BY [kolon ayıracı] ENCLOSED BY [kapatma işareti] LINES TERMINATED BY [satır ayıracı];

Yukarıdaki koddan tam anlaşılmayabilir. Ben kendi durumum için doldurduğumda aşağıdaki sonucu elde ediyorum.

LOAD DATA LOCAL INFILE 'c:\\GeoIPCountryWhois.csv' INTO TABLE geoip FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

Tablomuz hazır olduğuna göre, küçük bir php script'i ile ip'lerin hangi ülkeye ait olduğunu bulabilirsiniz.

<?php
$pth = "localhost";
$user = "root";
$psw = "123456";
$dbname = "country";

$con = mysql_connect($pth,$user,$psw);

if (!$con)
{
     die("Veritabanı bağlantısı sağlanamıyor: " . mysql_error());
}

mysql_select_db($dbname, $con);

// IPden Ülke kodunu ve ismini array olarak döndüren fonksiyon.
function getCountry($ip) {

          $ip = explode(".",$ip);
          
          $result = 16777216 * $ip[0] + 65536 * $ip[1] + 256 * $ip[2] + $ip[3];
          
          $sql = "SELECT cc, cn FROM geoip WHERE ".$result." BETWEEN start AND end";
          $result = mysql_query($sql);
          $country[0] = mysql_result($result,0,"cc");
          $country[1] = mysql_result($result,0,"cn");
          if(empty($ccode)) $ccode = "default";
          return $country;
}

$myip = $_SERVER['REMOTE_ADDR'];
$myip = "85.100.153.122"; // eğer localhostta çalıştırısanızi 127.0.0.1 döneceğinden, herhangi bir ülke bulunmayacaktır.
                // O yüzden örnek olarak bir ip adresi yazıyorum buraya, scripti kullanırken silmeyi unutmayın.
echo "IP Address = <b>".$myip."</b><br>n";
$code = getCountry($myip);
echo "Code = <b>".$code[0]."</b><br>n";
echo "Country = <b>".$code[1]."</b><br>n";

?>

27 Temmuz 2009 Pazartesi

3G Şakası


Bugün Avea 3G fiyatlarını açıkladı. Ancak bu fiyatlar dünya standartlarının çok üstünde. Ayrıca kotasız bir tarifede yok. Ücretlendirmeler şöyle;
  • Görüntülü Konuşma ücreti her yöne dakikası 10 kuruş/1 kontör olacak.
  • Cepten TV izlemek abonelik ücretine dahil olacak ve fiyatlar 5 TL'den başlayacak.
  • Belirli bir video, film seçip indirmenin ücreti ise 3,5 TL.
  • Cep telefonu için 100 MB kotalı bağlantı 8 TL
  • 2GB Kotalı bağlantı ise 35 TL.
  • Bilgisayar bağlantıları içinse 3G internet hızının maliyeti, 2GB 35 TL. 6GB 55 TL.
Birçok kişi 3G'nin TTNET ADSL hizmetine bir seçenek olacağını umut ediyordu. Ancak bu fiyatlarla normal kullanımın bile pahalı olduğunu söyleyebiliriz.

Diğer operatörlerde fiyatların çok oynamayacağını düşünüyorum. 3 gün sonra tüm operatörler tarifelerini açıklamış olacaklar.

Güncelleme:

Turkcell'inde fiyatlarıda çok farklı değil, işte fiyatlar.
  • 1 GB internet bağlantısı aylık 29TL, 4 GB 39TL, 8GB ise 69 TL.
  • Haftalık kullanmak isterseniz, 1 GB internet 19 TL.
  • Cepten internete girmek isterseniz, 100 MB 9 TL / 65 Kontör

23 Temmuz 2009 Perşembe

Ogre ile Küçük Bir Deneme

Önceki yazıda ogre ile uğraştığımdan bahsetmiştim. Deneme amaçlı bir oyun yazmaya çalıştım. Her projede kullanabileceğim bir kod oluşturmak istedim, ancak yeniden yazılması gerekiyor.

Kısaca anlatmam gerekirse, 3000x3000 lik bir düzlemde kamera, ağaçlar, kutular, çimler ve zombiler rastgele yerleştiriliyor. Daha sonra sizden oyundaki zombileri öldürmeniz isteniyor :). Oyunda Ogre'nin haricinde NxOgre eklentisini kullandım.


Linkler
NxOgre:
http://www.nxogre.org/
NxOgre Forum:
http://www.ogre3d.org/addonforums/viewforum.php?f=6

6 Temmuz 2009 Pazartesi

Ogre

Son günlerde OGRE (Object-Oriented Graphics Rendering Engine) ile uğraşmaya başladım. Kendim için ufak bir oyun projesine giriştim ve internetteki açık kaynak kodlu oyun motorlarını incelemeye başladım. Her ne kadar OGRE bir oyun motoru olmasada, özelliklerinin çok fazla olması dikkatimi çekti.

Biraz uğraştıktan sonra birşeyler oluşmaya başladı. Bir iki ekran görüntüsü veriyorum.



Siz de incelemek isteyebilirsiniz. Linkler aşağıda.

Linkler
Ogre Anasayfası:
http://www.ogre3d.org/
Ogre'nin Özellikleri:
http://www.ogre3d.org/about/features