Hoạ tiết ngược


8

Tôi đang cố gắng vẽ họa tiết phù hợp với cơ thể vật lý này có nguồn gốc hệ tọa độ nằm ở trung tâm của màn hình. (XNA) Spritebatch có nguồn gốc mặc định được đặt ở góc trên cùng bên trái. Tôi có kết cấu được định vị chính xác, nhưng tôi nhận thấy kết cấu của tôi bị đảo ngược theo chiều dọc. Đó là, một kết cấu mũi tên chỉ lên, khi kết xuất điểm xuống. Tôi không chắc mình sẽ sai môn toán ở đâu.

Cách tiếp cận của tôi là chuyển đổi mọi thứ theo đơn vị mét vật lý và vẽ theo.

        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();

trong đó Paddle :: Draw trông giống như:

       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);

Ma trận chiếu chính tả có vẻ tốt với tôi, nhưng rõ ràng tôi đang làm gì đó sai ở đâu đó! Ai đó có thể vui lòng giúp tôi tìm ra những gì tôi đang làm sai ở đây?

Cảm ơn


scaletiêu cực? Bạn có làm gì đặc biệt trong trình tạo bóng đỉnh / pixel cho hiệu ứng bạn đang sử dụng không (cụ thể là cách bạn thao tác / sử dụng tọa độ kết cấu?) Ngoài ra nếu bạn đang sử dụng XNA4, bạn không muốn truyền hiệu ứng vào Bắt đầu cuộc gọi () của đợt, thay vì gọi bằng tay?

quy mô thường là bất cứ nơi nào từ 50 đến 150. Nó không bao giờ âm. Tôi không làm gì thêm ngoài những gì tôi đã chỉ định ở đây. Tôi tạo hiệu ứng chỉ để sử dụng ma trận chiếu. Tôi đang sử dụng XNA4 và tôi chuyển hiệu ứng làm tham số cho Spritebatch.Begin (xem tham số cuối cùng); nhưng khi tôi làm điều đó..không kết cấu xuất hiện. Tôi đã phải gọi thủ công để làm cho kết cấu bắt đầu xuất hiện trên màn hình.
brainydexter

Ồ, tôi đã bỏ lỡ cuộc gọi Bắt đầu. Trong XNA, texcoords của (0,0) là góc trên cùng bên trái của hình ảnh. Nhưng có vẻ như bạn không có đủ quyền kiểm soát các texcoords ở đây để làm hỏng điều đó.

Vâng Tôi không hiểu làm thế nào spritebatch xử lý các ma trận chiếu có hiệu lực và tôi nghĩ đó là câu trả lời cho vấn đề của tôi.
brainydexter

Bạn luôn có thể kiểm tra mã nguồn cho spritebatch (SpriteEffect) để xem liệu nó có giúp bạn hiểu không: created.msdn.com/en-US/education/catalog/sample/stock_effects
Joel Martinez

Câu trả lời:


4

Nhìn vào tài liệu tham khảo của Matrix.CreateOrthographic và chú ý rằng nó nói điều này:

Vùng có thể xem của phép chiếu chính tả này được tập trung vào 0,0,0. Trục x của khu vực nằm trong phạm vi từ-Băng thông / 2 đến chiều rộng / 2. Trục y của khu vực nằm trong khoảng từ -height / 2 đến height / 2.

Vì vậy, trong trường hợp của bạn, viền trên của màn hình có tọa độ Y là -scale / 2 thay vì 0 và viền dưới là tỷ lệ / 2 thay vì tỷ lệ. Và nếu bạn đang vẽ một hình tứ giác (10,10) tại tọa độ (0, 0), điểm gốc của nó sẽ ở giữa màn hình, nhưng vì chữ Y dương của bạn hướng xuống dưới, bạn sẽ thấy nó bị đảo ngược.

Các lựa chọn tốt nhất của bạn chỉ là đảo ngược tham số thứ hai để trục Y của bạn hướng lên trên hoặc xác định ma trận chính tả với Matrix.CreateOrthographic OfferCenter để bạn có thể chỉ định thủ công nguồn gốc thế giới.


0

Tôi nghĩ bạn sẽ có thể đảo ngược mọi thứ bằng cách sử dụng ma trận thế giới hiệu ứng của bạn:

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

Thay vì sử dụng danh tính, như bạn có bây giờ.

Tôi hi vọng cái này giúp được.


0

Không cần phải tự tạo và gán ma trận chuyển đổi hiệu ứng của bạn. Spritebatch tạo ra những thứ này cho bạn. Cách đơn giản nhất là tạo hiệu ứng không có trình tạo bóng đỉnh (trừ khi bạn đang làm gì đó trong đó ngoài phép chiếu thế giới quan dự kiến), vì SpriteBatch đã có trình tạo bóng đỉnh sẽ đảm nhiệm việc chuyển đổi. Sau đó, nó sẽ sử dụng pixel shader của bạn.

Ngoài ra, tôi không chắc liệu cách bạn hiện đang làm có hoạt động chính xác không, nhưng có một sự quá tải khác nhau spriteBatch.Beginsẽ lấy Hiệu ứng làm tham số. Tôi không chắc liệu SpriteBatch có thể gán đúng cho hiệu ứng hiện tại hay không nếu bạn không chuyển nó vào Begin().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.