Oyun dünyamın x ekseni soldan sağa, y ekseni yukarıdan aşağıya ve z ekseni ekrandan çıktığı bir 2D oyun yazıyorum :
Oyun dünyam yukarıdan aşağıya iken, oyun hafif bir eğimde işleniyor:
Dünya uzayından ekran uzayına ve tam tersine projeksiyon üzerinde çalışıyorum. Önceki çalışma aşağıdaki gibi var:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
NegateY()
Uzatma yöntemi XNA beri, gibi sesler tam olarak ne yapar y ekseni altına yerine üst üste alt çalışır. Yukarıdaki ekran görüntüsü tüm bunların işe yaradığını gösterir. Temel olarak, 3B alanda daha sonra ekran alanında oluşturduğum bir sürü nokta var. Kamera özelliklerini gerçek zamanlı olarak değiştirebilir ve yeni pozisyona hareket ettiğini görebilirim. Açıkçası gerçek oyunum puan yerine sprite kullanacak ve kamera pozisyonu sabitlenecek, ama ben buna başlamadan önce tüm matematiği yerleştirmeye çalışıyorum.
Şimdi, diğer yöne dönmeye çalışıyorum. Yani, yukarıdaki ekran boşluğunda bir x ve y noktası verildiğinde , dünya uzayındaki karşılık gelen noktayı belirleyin. Bu yüzden imleci yeşil trapezoid'in sol alt tarafına doğrultursam, (0, 480) dünya uzay okumasını almak istiyorum. Z koordinat önemsizdir. Ya da daha ziyade, dünya uzayına geri eşlenirken z koordinatı her zaman sıfır olacaktır. Aslında, bu yöntem imzasını uygulamak istiyorum:
public Vector2 ScreenPointToWorld(Vector2 point)
Ben bu işe almak için birkaç şey denedim ama sadece şansım yok. Son düşüncem, Viewport.Unproject
farklı yakın / uzak z değerleri ile iki kez aramam , ortaya çıkan sonucu hesaplamam Ray
, normalleştirmem ve daha sonra temelde dünyamın zemin seviyesini temsil eden Ray
bir ile kesişimini hesaplamam gerektiğidir Plane
. Ancak, son adımda takıldım ve fazla karmaşık olup olmadığımdan emin değildim.
Biri bana bunu nasıl başaracağımı doğru yönde gösterebilir mi?