微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – XNA – 矩阵相当于SpriteBatch.Draw转换?

我有这个界面:

interface Drawable {
    Vector2 DrawPosition { get; }
    Texture2D Texture { get; }
    float Rotation { get; }
    Vector2 Origin { get; }
    Vector2 Scale { get; }
    bool FlipHorizontally { get; }
}

在扩展Microsoft.Xna.Framework.Game的类中,我重写了Draw(GameTime),这段代码就在那里:

Drawable d = ...;
spriteBatch.Begin();
spriteBatch.Draw(d.Texture,d.DrawPosition,new Rectangle(0,d.Texture.Width,d.Texture.Height),Color.White,d.Rotation,d.Origin,d.Scale,d.FlipHorizontally ? SpriteEffects.FlipHorizontally : SpriteEffects.None,0);
spriteBatch.End();

这使用SpriteBatch.Draw(Texture2D纹理,Vector2位置,Nullable sourceRectangle,Color颜色,float旋转,Vector2原点,Vector2 scale,SpriteEffects效果,float layerDepth)重载.

假设我有一组顶点,这些顶点构成了d.Texture返回的图像的粗略轮廓(也就是说,如果我在Microsoft Paint中打开图像并从顶点集合中的每个点进行铅笔处理,它将非常接近).如果我想绘制这些点以便它们使用GraphicsDevice.DrawUserPrimitives()遍历纹理,是否有办法仅使用矩阵转换顶点?关键是它只能使用矩阵,我没有其他的绘图选择,因为我实际上也需要将变换后的顶点用于其他事物.我已经尝试过类似的东西

Matrix.CreateTranslation(new Vector3(-d.Origin,0))
    * Matrix.CreateScale(new Vector3(d.Scale,0))
    * Matrix.CreateRotationZ(d.Rotation)
    * Matrix.CreateTranslation(new Vector3(d.DrawPosition,0)));

但它很难失败.有这个问题的解决方案吗?

解决方法

您的矩阵代码看起来适合于World矩阵(将模型放置在世界空间中).所以我的猜测是这些事情之一:

>你的原语在模型空间中处于错误的位置. Sprite批处理创建一个多边形,其中(0,0)是精灵的左上角,({texture width},{texture height})是右下角.您的基元需要具有相同的大小并且位于相同的位置.
>你的投影矩阵是错误的.请参见this answer.请注意,SpriteBatch使用翻转(客户端空间)坐标系.
>您的背面剔除模式错误(不考虑翻转坐标系).
>您遇到深度缓冲问题(您需要在远处和近处飞机上绘图,并且您是否被任何东西深度剔除?)

如果您仍有问题,请从DirectX SDK获取PIX并使用它来识别您的游戏实际绘制的内容.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐