Saya mencoba menggambar tekstur selaras dengan badan fisika ini yang asal sistem koordinatnya ada di tengah layar. (XNA) Spritebatch memiliki asal default ditetapkan ke sudut kiri atas. Saya mendapatkan tekstur untuk diposisikan dengan benar, tetapi saya perhatikan tekstur saya terbalik secara vertikal. Yaitu, tekstur panah yang menunjuk ke Atas, ketika menunjukkan poin ke bawah. Saya tidak yakin di mana saya salah dengan matematika.
Pendekatan saya adalah untuk mengkonversi semua dalam satuan meter fisik dan menggambar sesuai.
Matrix proj = Matrix.CreateOrthographic(scale * graphics.GraphicsDevice.Viewport.AspectRatio, scale, 0, 1);
Matrix view = Matrix.Identity;
effect.World = Matrix.Identity;
effect.View = view;
effect.Projection = proj;
effect.TextureEnabled = true;
effect.VertexColorEnabled = true;
effect.Techniques[0].Passes[0].Apply();
SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, DepthStencilState.Default, RasterizerState.CullNone, effect);
m_Paddles[1].Draw(gameTime);
SpriteBatch.End();
dimana Paddle :: Draw terlihat seperti:
SpriteBatch.Draw(paddleTexture,
mBody.Position,
null,
Color.White,
0f,
new Vector2(16f, 16f), // origin of the texture
0.1875f, SpriteEffects.None, // width of box is 3*2 = 6 meters. texture is 32 pixels wide. to make it 6 meters wide in world space: 6/32 = 0.1875f
0);
Matriks proyeksi ortografis tampak baik bagi saya, tetapi saya jelas melakukan sesuatu yang salah di suatu tempat! Dapatkah seseorang tolong bantu saya mencari tahu apa yang saya lakukan salah di sini?
Terima kasih
sumber
scale
negatif? Apakah Anda melakukan sesuatu yang spesial di vertex / pixel shader untuk efek yang Anda gunakan (khususnya bagaimana Anda memanipulasi / menggunakan koordinat tekstur?) Juga jika Anda menggunakan XNA4 jangan Anda ingin meneruskan efek ke Mulai () panggilan bets, daripada mencoba menjalankannya secara manual?Jawaban:
Lihatlah referensi Matrix.CreateOrthographic , dan perhatikan bahwa ia mengatakan ini:
Area yang dapat dilihat dari proyeksi ortografi ini berpusat pada 0,0,0. Sumbu x area berkisar dari-lebar / 2 hingga lebar / 2. Sumbu-y area berkisar dari -tinggi / 2 hingga tinggi / 2.
Jadi, dalam kasus Anda, batas atas layar memiliki koordinat Y dari-skala / 2 bukan 0, dan batas bawah adalah skala / 2 bukan skala. Dan jika Anda menggambar quad ukuran (10,10) pada koordinat (0, 0), titik asal akan berada di tengah layar, tetapi karena Y positif Anda ke bawah, Anda akan melihatnya terbalik.
Pilihan terbaik Anda hanyalah membalikkan parameter kedua sehingga sumbu Y Anda menunjuk ke atas, atau mendefinisikan matriks ortografis dengan Matrix.CreateOrthographicOffCenter sehingga Anda dapat menentukan asal dunia secara manual.
sumber
Saya pikir Anda harus dapat membalikkan hal-hal menggunakan matriks dunia efek Anda:
Alih-alih menggunakan identitas, seperti yang Anda miliki sekarang.
Saya harap ini membantu.
sumber
Tidak perlu secara manual membuat dan menetapkan matriks transformasi efek Anda. Spritebatch menciptakan ini untuk Anda. Cara paling sederhana adalah membuat efek tanpa vertex shader (kecuali jika Anda melakukan sesuatu di sana selain proyeksi pandangan-dunia yang diharapkan), karena SpriteBatch sudah memiliki vertex shader yang akan menangani transformasi. Maka itu akan menggunakan pixel shader Anda.
Juga, saya tidak yakin apakah cara Anda saat ini bekerja dengan benar, tetapi ada kelebihan yang berbeda
spriteBatch.Begin
yang menggunakan Efek sebagai parameter. Saya tidak yakin apakah SpriteBatch dapat dengan tepat menetapkan efek saat ini jika Anda tidak meneruskannyaBegin()
.sumber