XNA的SpriteBatch.Draw旋转,缩放和起源?

我使用1×1像素2D纹理作为SpriteBatch.Draw来源。 纹理缩放并围绕原点旋转。 左图只是缩放。 在底部中心的原点周围正确缩放+旋转。 我需要正确的图像作为结果。 即缩放到5×10和旋转2.5×10

在这里输入图像描述

如果原始参数在源纹理之外,问题是1×1纹理绘制开始行为奇怪。 只要原点被限制在1×1的最大值,就不可能围绕缩放纹理的底部中心旋转。

为什么起源的行为奇怪,如果它在源纹理之外? 奇怪的我的意思是纹理移动更多的原点值集。 即如果它的原点x = 10,则纹理移动多于10个像素。

我认为你错误地解释了将原点设置为(0.5f, 1) 。 我做了同样的事情,并得到了预期的结果。 这里是我在这个答案运行的代码的修改版本:

 Color[] colors = new Color[] { Color.White }; texture = new Texture2D(GraphicsDevice, 1, 1); texture.SetData<Color>(colors); spriteBatch.Draw(texture, new Rectangle(100, 50, 100, 100), null, Color.Green); spriteBatch.Draw(texture, new Rectangle(100, 225, 100, 100), null, Color.Yellow, 0, new Vector2(0, 0), SpriteEffects.None, 0); spriteBatch.Draw(texture, new Rectangle(100, 400, 100, 100), null, Color.Pink, 0, new Vector2(0.5f, 1f), SpriteEffects.None, 0); spriteBatch.Draw(texture, new Rectangle(400, 50, 100, 100), null, Color.Red, MathHelper.PiOver4, Vector2.Zero, SpriteEffects.None, 0); spriteBatch.Draw(texture, new Rectangle(400, 225, 100, 100), null, Color.Orange, MathHelper.PiOver4, new Vector2(0, 0), SpriteEffects.None, 0); spriteBatch.Draw(texture, new Rectangle(400, 400, 100, 100), null, Color.Blue, MathHelper.PiOver4, new Vector2(0.5f, 1f), SpriteEffects.None, 0); 

正如你所看到的,蓝色的正方形围绕着底部中心旋转,正如预期的那样。 其他方块围绕(0,0)旋转。

在这里输入图像描述

设置与源矩形相关的原点。 如果矩形为0:0:1:1,则设置0.5:1原点(对于底部中心)。

我认为你应该把这个尺度的原点分开

因为spritebatch在缩放操作之前应用原点转换,所以您必须反转缩放操作以避免缩放原点