Öncelikle, çizim problemimin tam olarak ne olduğunu biliyorum ve çözme yaklaşımına nasıl yaklaşacağım konusunda çeşitli fikirlerim var. İzometrik "yanılsama" korunacak şekilde hangi çerçevenin çizileceğini ayarlamak için buradayım.
Uzayda yer alan 2 boyutlu, kuşbakışı bir oyun yazıyorum. İzometrik grafikleri Up'ın Kuzey olduğu bir dünyada kullanmaya çalışıyorum, geleneksel izometrik oyunlarda olduğu gibi oyun dünyasını döndürmüyorum (unutmayın, oyun uzayda gerçekleşiyor, arazi yok). Kullanmaya çalıştığım örnek bir hareketli grafik: http://cell.stat-life.com/images/stories/AsteroidOutpost/Spaceship64.png 35 derecelik görüş açısına sahip kendi dikey ekseni hakkında 64 kez döndürüldü (aka, izo). Görüntü yaratıldı, bu nedenle bu olabilir değiştirilemez.
Anlaşılır olması için, Kuzey'in (Yukarı) 0 derece ve Doğu'nun (Sağ) 90 olduğunu dikte ettim.
Benim sorunum, sprite'ım her zaman oyunun kullanılan 3D uçaklardaki bir farktan kaynaklandığını düşündüğü yere bakmıyor gibi görünüyor . Terminolojiyi doğru şekilde kullanıp kullanmadığımdan emin değilim, ancak uzay gemim bir düzlemde döndürüldü ve görüş düzlemi, şeylerin kendi düzleminde döndürülmesini bekliyor. İşte sorunun bir tasviri:
http://cell.stat-life.com/images/stories/AsteroidOutpost/ProjectionIssue.png Solda, ben sağda ben yukarıdan aşağıya görüşlere sahip, yan görüşlere sahip. Üstte, dünyanın uzay gemisi / sprite sayfası görünümü var. Altta, ekrana çizildiğinde sprite neye benziyor .
Sağ üstte uzay gemimin nasıl döndürüldüğünün basitleştirilmiş bir versiyonu var (her bir çerçeve arasında eşit derecede ayrımlar). Sağ altta açı sprite olmasıdır görünüyor belirli bir açı ekranda çizildiğinde bunun gibi yüzleşiyor. Sorun en çok yaklaşık 45 derecede belirgindir. Geminin karşı karşıya kaldığı yöne işaret eden bir "ekran düzlemi" çizgisiyle kaplanmış bir görüntü: http://cell.stat-life.com/images/stories/AsteroidOutpost/Spaceship64RedLine.png Kırmızı çizgi her zaman gemiyle tam olarak aynı yönde olmalıdır , ancak gördüğünüz gibi, projeksiyon sorunu bir soruna neden oluyor. Umarım sorunu yeterince iyi açıklarım.
DÜZENLEME: Uzay gemisi "gemi uçağı" üzerinde döndürülürken, kırmızı çizgi ekran düzleminde döndürülür, bu nedenle çizildiğinde gemi açısı ile ekran açısı arasındaki büyük fark. SON DÜZENLEME
Bu gemi bir tarafa kapalı bir hedefe lazer ışını çekerken, düz bir şekilde ateş etmesi gerektiğinde oldukça garip görünüyor.
Yani ... bulduğum çözümler:
- İzometrik bir görünümü taklit etmeye, büyük veya eve gitmeye çalışmayı bırak. Dünyamı zaten döndür. (PS: bu sorunumu çözecek değil mi?)
- Sprite sayfamı (her nasılsa) modelin görüntüleneceği "ekran açısını" temsil eden karelere sahip olacak şekilde değiştirin. Yani 45 derecelik bir görüntü istediğimde, aslında ekranda 45 dereceye bakmış gibi görünecek.
- Sprite oluşturma sistemimi, "normal" çerçeveyi yakalamanın komik görüneceğini bilerek sprite sayfasından (her nasılsa) farklı bir çerçeve kapmak için değiştir. Bu nedenle 45 derecelik çerçeveyi tutmak yerine, ... 33 derece çerçeveyi (sadece tahmin) yakalar, böylece kullanıcıya doğru görünür .
- Sadece 3D kullanın! Çok daha kolay adamım
Birincisi: Hangi çözümü önerirsiniz? Yanlış olduğunu bilsem bile 2'ye doğru eğildim. Hareketli grafik oluşturma aracına tam erişimim olduğunu unutmayın. Yöntem 3 benim ikinci tercihim olurdu. Bu yöntemlerin her ikisi de, istenen sonucumu elde etmek için açılara biraz matematik uygulamamı gerektirir. Btw, şaka olarak # 4 ekledim, 3D'ye geçmek istemiyorum.
İki kişilik: Yöntem 2 veya 3'ü kullanarak giriş veya çıkış açılarını nasıl ayarlayabilirim? 3D projeksiyonlar ve 3D matrisler (bırakın 2D matrisler) ile o kadar iyi değilim ve bana istenen sonucu elde etmek için başka herhangi bir matematik kullanılabilir.
Burada yüksek sesle düşünmek: geminin bakmasını istediğim yöne bakan bir birim vektörü alırsam (ekran düzleminde), o zaman bunu gemi düzlemine yansıtırsanız, o zaman yansıtılan çizgi ile uçağın arasındaki açının ne olduğunu anlayın kuzeyde, göstermek istediğim gemi grafiğinin açısına sahip olmalıyım. Sağ? (# 3 için çözüm?) Adam ... Bunu çözemiyorum.
DÜZENLE:
Sorunun statik görüntülerle görselleştirilmesinin zor olduğunu biliyorum, bu yüzden sorunu göstermek için Sprite Library Visual Tester'a uydum : http://cell.stat-life.com/downloads/SpriteLibVisualTest.zip XNA 4.0 gerektirir Bu uygulama basitçe hareketli çizgiyi döndürmek ve oyunun geminin karşı karşıya kalması gerektiğini düşündüğü açıda merkez noktasından dışa doğru bir çizgi çizmek.
8 Eylül DÜZENLE
"Yüksek sesle düşünmek" paragrafımdan devam etmek: Bir projeksiyon kullanmak yerine (zor göründüğü için) kuzeye bakan birim vektörü (0x, 1y, 0z) alabileceğimi, açıya döndürmek için bir matris kullanabileceğimi düşünüyorum hareketli grafik aslında bakacak şekilde, sonra tekrar "görüntüleme düzleminden" X ekseni etrafındaki "hareketli grafik düzlemine" döndürün, sonra ... düzleştirin? vektör (esasen onu yansıtır) sadece X ve Y kullanarak (Z yoksayılır) görüntüleme düzlemine geri döner. Sonra bu yeni düzleştirilmiş vektörü kullanarak, açısını belirleyebilir ve bunu ... bir şey yapmak için kullanabilirim. Daha sonra düşüneceğim.
8 Eylül DÜZENLE (2)
Fikrimi yukarıdan takip etmeyi denedim, yay! Yani ... uzay gemimden çıkmış gibi görünen kırmızı bir çizgi elde etmek için (sadece test amaçlı), aşağıdakileri yaptım:
Vector3 vect = new Vector3(0, 1, 0);
vect = Vector3.Transform(vect, Matrix.CreateRotationZ(rotation));
vect = Vector3.Transform(vect, Matrix.CreateRotationY((float)((Math.PI / 2) - MathHelper.ToRadians(AngleFromHorizon))));
Vector2 flattenedVect = new Vector2(vect.X, vect.Y);
float adjustedRotation = (float)(getAngle(flattenedVect.X, flattenedVect.Y));
rotation
Ekran açısı nerede ve adjustedRotation
şimdi ekran açısı hareketli grafiğe bakıyor. X yerine Y'yi neden döndürmem gerektiğini bilmiyorum, ama muhtemelen bilmediğim 3D ile ilgili bir şey.
Peki, şimdi ek bir bilgim var, ancak daha uygun bir çerçeve seçmek için bunu nasıl kullanabilirim? Belki bakış düzleminden hareketli grafiğe dönüp sonra geri yansıtmak yerine, bunu tam tersine yapmaya çalışmalıyım. İşte benim sprite ayarlanmış bir kırmızı çizgi ile, ama gerçekten yapmak istediğim modeli değil çizgiyi ayarlamak: http://cell.stat-life.com/images/stories/AsteroidOutpost/Spaceship64RedLineCorrected.png
9 Eylül EDIT
HORAY! Düzeltildi! Bunu düzeltmek için ne yaptığımı açıklayacağım:
EBusiness'ın tavsiyelerine uydum ve dünya koordinat sistemi tarafından "ezildim" (ya da gerildim ...?). Bu aslında 1 numaralı çözümdür, ancak dünya koordinat sistemimi ekran koordinat sistemine göre döndürmem gerektiği izlenimi altındaydım. Doğru değil! Yukarı hala + y ve Sağ hala + x. WorldToScreen ve ScreenToWorld yöntemlerimi, dünya ve ekran koordinatları arasında düzgün bir şekilde dönüştürmek için değiştirdim. Bu yöntemler en uygun olmayabilir, ancak burada kod tabanımda değişmesi gereken tek iki yöntem var.
public Vector2 ScreenToWorld(float x, float y)
{
float deltaX = x - (size.Width / 2f);
float deltaY = y - (size.Height / 2f);
deltaX = deltaX * scaleFactor / (float)Math.Sqrt(3);
deltaY = deltaY * scaleFactor;
return new Vector2(focusWorldPoint.X + deltaX, focusWorldPoint.Y + deltaY);
}
public Vector2 WorldToScreen(float x, float y)
{
float deltaX = x - focusWorldPoint.X;
float deltaY = y - focusWorldPoint.Y;
deltaX = deltaX / scaleFactor * (float)Math.Sqrt(3);
deltaY = deltaY / scaleFactor;
return new Vector2(size.Width / 2f + deltaX, size.Height / 2f + deltaY);
}
Hepsi bu kadar! Bu iki yöntemi değiştirmek her şeyi etkiledi: neye bakıyordum, çizilen nesneler nerede, nereye tıklıyordum, her şey. Uzay gemim şimdi doğrudan vurduğu hedefe bakıyor ve her şey yerine oturuyor. Ortografik izdüşümü deneyeceğim, bakın her şeyin daha 'gerçek' görünmesini sağlıyor.