![]()
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转换?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)