1

我是 XNA 的新手,想在它上面开发一个轻量级的 2D 引擎,将实体组织成父子层次结构。我在画孩子的时候会想到矩阵,因为他们的位置、旋转和比例取决于他们的父母。

如果我使用SpriteBatch.Begin(),我的矩形可以在屏幕上绘制,但是当我将它们更改为:

        this.DrawingMatrix = Matrix.Identity;
        this.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullClockwise, null, this.DrawingMatrix);

什么都没有画了。我什至尝试过new Matrix()Matrix.CreateTranslation(0, 0, 0)DrawingMatrix.

我的第一个问题是:为什么它不起作用?我没有使用任何相机或视口。

其次,在绘制实体之前,我调用PreDraw来转换矩阵(然后我将在 处重置为原始状态PostDraw):

    protected virtual void PreDraw(Engine pEngine)
    {
        pEngine.DrawingMatrix *=
            Matrix.CreateTranslation(this.X, this.Y, 0) *
            Matrix.CreateScale(this.ScaleX, this.ScaleY, 1) *
            Matrix.CreateRotationZ(this.Rotation);
    }

请澄清上述代码的更正。而且我不需要在原点进行缩放,而是在ScaleCenterXand ScaleCenterY,我该如何实现呢?

添加:这是我的引擎绘制过程的示例:

  1. 调用这些代码:

        this.DrawingMatrix = Matrix.CreateTranslation(0, 0, 0);
        this.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullClockwise, null, this.DrawingMatrix);
    
  2. 调用PreDraw(), 是:

    protected virtual void PreDraw(Engine pEngine)
    {
        pEngine.DrawingMatrix *=
            Matrix.CreateTranslation(this.X, this.Y, 0) *
            Matrix.CreateScale(this.ScaleX, this.ScaleY, 1) *
            Matrix.CreateRotationZ(this.Rotation);
    }
    
  3. Draw()例如,在我的Rect课堂上调用:

    protected override void Draw(Engine pEngine)
    {
        pEngine.SpriteBatch.Draw(pEngine.RectangleTexture, new Rectangle(0, 0, (int)this.Width, (int)this.Height), new Rectangle(0, 0, 1, 1), this.Color);
    }
    

如果我用 替换上面的Begin代码this.SpriteBatch.Begin(),则矩形绘制正确,所以我猜这是因为矩阵。

4

1 回答 1

4

第一个问题是一个简单的错误:默认为SpriteBatchis CullCounterClockwise,但您已指定CullClockwise导致所有精灵被背面剔除。如果您只想使用默认渲染状态,则可以通过null- 您不需要明确指定它们。

(如果您使用负比例,则需要更改剔除模式。)

要回答您的第二个问题:您需要翻译“后退”以将缩放原点(您的ScaleCenterXScaleCenterY)放置在世界原点(0,0)。转换总是发生在 (0,0) 附近。所以通常顺序是:将精灵原点翻译回世界原点,缩放,旋转,翻译以将精灵原点放置在所需的世界位置。

另外,我希望你PostDraw没有应用反向转换(你让它听起来像它一样)。这很可能会导致精度问题。您应该保存并恢复矩阵。

于 2013-01-09T17:08:31.430 回答