Tekstur terbalik

8

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

brainydexter
sumber
Apakah scalenegatif? 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?
skala biasanya berkisar antara 50 hingga 150. Skala tidak pernah negatif. Saya tidak melakukan sesuatu yang lebih dari apa yang saya sebutkan di sini. Saya membuat efek hanya menggunakan matriks proyeksi. Saya menggunakan XNA4, dan saya meneruskan efek sebagai parameter ke Spritebatch.Begin (lihat parameter terakhir); tetapi ketika saya melakukan itu..tidak ada tekstur yang muncul. Saya harus memohon secara manual untuk membuat tekstur mulai muncul di layar.
brainydexter
Oh, aku melewatkan panggilan Mulai. Dalam XNA, texcoords of (0,0) adalah sudut kiri atas gambar. Tapi itu tidak terdengar seperti Anda memiliki kontrol yang cukup dari texcoords di sini untuk mengacaukannya.
Ya. Saya tidak mengerti bagaimana spritebatch menangani matriks proyeksi yang berlaku dan saya pikir di situlah letak jawaban untuk masalah saya.
brainydexter
Anda selalu dapat memeriksa kode sumber untuk spritebatch (SpriteEffect) untuk melihat apakah itu membantu pemahaman Anda: create.msdn.com/en-US/education/catalog/sample/stock_effects
Joel Martinez

Jawaban:

4

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.

r2d2rigo
sumber
0

Saya pikir Anda harus dapat membalikkan hal-hal menggunakan matriks dunia efek Anda:

effect.World = Matrix.CreateScale(1, -1, 1);

Alih-alih menggunakan identitas, seperti yang Anda miliki sekarang.

Saya harap ini membantu.

VeraShackle
sumber
0

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 meneruskannya Begin().

Tim R.
sumber