29 Nisan 2009 Çarşamba

MOUSE RAYI BULMA (MOUSE UN HERHANGİ BİR MODEL İLE KESİŞİMİNİ FARKETMEK)

XNA mousun kesişimini bulmak için direk bir metod sunmamaktadır.Bu yüzden bunu kendimiz birkaç satır kodla halletmeliyiz.

 

Vector3 nearsource = new Vector3((float)currentstate.X, (float)currentstate.Y, -.0001f);

//en sondaki değeri ufak tutmamızda fayda var.O değerin büyük olması sonucunda mouse un ekrandaki 3d yerini tam olarak tespit etmemiz bi hayli zor.En ufak ayrıntılarda da mevcut bölgeyi hesaba katmak istiyorsak şu anki değer ideal.

 Vector3 farsource = new Vector3((float)currentstate.X, (float)currentstate.Y, .0001f);

Matrix proj = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), aspect, 100f, 10000.0f);

Matrix cameraview2 = Matrix.CreateLookAt(cameraview, lookAt, Vector3.Up);

Matrix world = Matrix.CreateTranslation(groundposition) * Matrix.CreateRotationZ(camerarrotation.Z);

 

Vector3 nearPoint = g.GraphicsDevice.Viewport.Unproject(nearsource, proj, cameraview2, world);

 

Vector3 farPoint = g.GraphicsDevice.Viewport.Unproject(farsource, proj, cameraview2, world);

 

Vector3 direction = farPoint - nearPoint;

direction.Normalize();

Ray pickRay = new Ray(nearPoint, direction);

 

//Buraya kadar mouse un mevcut x ve y değerlerini x,y,z değerine çevirmiş olduk.Rayin kesişimi sonuc olarak float? Değer vericektir.Yani ya kesişimin uzaklığını yada null değer.Değer null değilse demekki kesişiyordur.

 

foreach (Building b in buildings)

        {

float? a = pickRay.Intersects(b.boundingsphere);

if (b.isDrawn && a.HasValue && currentstate.LeftButton == ButtonState.Pressed && laststate.LeftButton == ButtonState.Released)

          {//Kesişim varsa istediğimizi yaptırıyoruz.

Mesela buradaki kod mouse ile bastığınız yerde bir bina var ise bu binayı aktif bina yapıyor ve ilgili müziği çalıyor.

         foreach (Road r2 in carroads)

            {

              r2.color = new Vector3(1,1,1);

              r2.islastActive = false;

            }

         foreach (Building d in buildings)

            { d.lastActive = false; }

              b.lastActive = true;

              activeBuilding = new Building(b, content);

              if (activeBuilding.bclass.Equals("b"))

                 soundBank.PlayCue("house");

              if (activeBuilding.name.Equals("Small Factory") || activeBuilding.name.Equals("Infant Food Factory"))

                 soundBank.PlayCue("factory");

                if (activeBuilding.name.Equals("Village Clinic"))

                 soundBank.PlayCue("coughing");

                if (activeBuilding.name.Equals("Big Factory"))

                 soundBank.PlayCue("factory2");

                if (activeBuilding.name.Equals("Hospital") || activeBuilding.name.Equals("Grand Hospital"))

                 soundBank.PlayCue("hospital");

               if (activeBuilding.bclass.Equals("p"))

                soundBank.PlayCue("police");

              if (activeBuilding.bclass.Equals("sh") || activeBuilding.bclass.Equals("s"))

                soundBank.PlayCue("school2");

            }

}

Hiç yorum yok:

Yorum Gönder