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, 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并使用它来识别您的游戏实际绘制的内容.

点赞