加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:24:10 所属栏目:百科 来源:网络整理
导读:说我有这个界面: interface Drawable { Vector2 DrawPosition { get; } Texture2D Texture { get; } float Rotation { get; } Vector2 Origin { get; } Vector2 Scale { get; } bool FlipHorizontally { get; }} 在扩展Microsoft.Xna.Framework.Game的类中,
说我有这个界面:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读