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})是右下角.您的基元需要具有相同的大小并且位于相同的位置. 如果您仍有问题,请从DirectX SDK获取PIX并使用它来识别您的游戏实际绘制的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |