gpt4 book ai didi

Xna SpriteBatch Matrix.Decompose()

转载 作者:行者123 更新时间:2023-12-02 05:38:01 27 4
gpt4 key购买 nike

我想要做的是能够将变换矩阵推送和弹出到 SpriteBatch 中。我有 2 个 Sprite ,父级和子级,子级应该相对于父级进行缩放、旋转、平移。

我目前有一个使用纹理四边形的实现,但我认为使用内置的 SpriteBatch 类和使用 Matrix.Decompose() 应该可以实现。不过,在分解后,我不确定如何将分解后的值传递给 SpriteBatch。

我了解如何保留矩阵堆栈,我只是在寻找将来自 Matrix.Decompose() 的值与 SpriteBatch 结合使用的示例。

最佳答案

终于我自己解决了这个问题。大部分功劳都属于这个blog post不过。

您可以使用此方法来分解矩阵:

private void DecomposeMatrix(ref Matrix matrix, out Vector2 position, out float rotation, out Vector2 scale)
{
Vector3 position3, scale3;
Quaternion rotationQ;

matrix.Decompose(out scale3, out rotationQ, out position3);

Vector2 direction = Vector2.Transform(Vector2.UnitX, rotationQ);
rotation = (float)Math.Atan2((double)(direction.Y), (double)(direction.X));
position = new Vector2(position3.X, position3.Y);
scale = new Vector2(scale3.X, scale3.Y);
}

然后您可以为叶子 Sprite 构建一个变换矩阵,如下所示:

Matrix transform = 
Matrix.CreateScale(new Vector3(this.Scale, 1.0f)) *
Matrix.CreateRotationZ(this.Rotation) *
Matrix.CreateTranslation(new Vector3(this.Position, 0));

对于您的父 Sprite ,请包含原点:

Matrix transform = 
Matrix.CreateTranslation(new Vector3(-this.Origin, 0)) *
Matrix.CreateScale(new Vector3(this.Scale, 1.0f)) *
Matrix.CreateRotationZ(this.Rotation) *
Matrix.CreateTranslation(new Vector3(this.position, 0));

以相反顺序乘以堆栈中的所有矩阵。

关于Xna SpriteBatch Matrix.Decompose(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2340303/

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