gpt4 book ai didi

algorithm - 如何正确使用 SpriteBatch 的转换矩阵?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:36 26 4
gpt4 key购买 nike

我是 XNA 的新手,想在其基础上开发一个轻量级的 2D 引擎,并将实体组织成父子层次结构。我在画 child 的时候想到了矩阵,因为他们的位置、旋转和缩放都取决于他们的 parent 。

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

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

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

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

其次,在绘制实体之前,我调用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);
}

请澄清上述代码的更正。我需要缩放的不是原点,而是 ScaleCenterXScaleCenterY,我该如何实现?

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

  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);
    }

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

最佳答案

第一个问题是一个简单的错误:SpriteBatch 的默认值是 CullCounterClockwise,但您指定了 CullClockwise 导致所有 Sprite 返回-面部剔除。如果您只想使用默认渲染状态,则可以传递 null - 您不需要明确指定它们。

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

要回答您的第二个问题:您需要将缩放原点(您的 ScaleCenterXScaleCenterY)平移“返回”到世界原点 (0,0) .转换总是发生在 (0,0) 附近。所以通常的顺序是:将 Sprite 原点平移回世界原点,缩放,旋转,平移以将 Sprite 原点放置在所需的世界位置。

此外,我希望您的 PostDraw 没有应用逆向转换(您让它听起来像是在应用)。那很可能会导致精度问题。您应该改为保存和恢复矩阵。

关于algorithm - 如何正确使用 SpriteBatch 的转换矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com