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

c# – XNA – 矩阵相当于SpriteBatch.Draw转换?,第1张

概述说我有这个界面: interface Drawable { Vector2 DrawPosition { get; } Texture2D Texture { get; } float Rotation { get; } Vector2 Origin { get; } Vector2 Scale { get; } bool FlipHorizonta 说我有这个界面:

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

总结

以上是内存溢出为你收集整理的c# – XNA – 矩阵相当于SpriteBatch.Draw转换?全部内容,希望文章能够帮你解决c# – XNA – 矩阵相当于SpriteBatch.Draw转换?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1234459.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存