首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xna SpriteBatch Matrix.Decompose()

Xna SpriteBatch Matrix.Decompose()
EN

Stack Overflow用户
提问于 2010-02-26 16:23:51
回答 1查看 1.6K关注 0票数 5

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

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

我知道如何保持矩阵堆栈,我只是在寻找一个结合使用来自Matrix.Decompose()和SpriteBatch的值的示例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-01 02:39:02

我自己终于想明白了。不过,大部分功劳都要归功于这个blog post

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

代码语言:javascript
复制
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);
}

然后,您可以像这样构建叶精灵的变换矩阵:

代码语言:javascript
复制
Matrix transform = 
    Matrix.CreateScale(new Vector3(this.Scale, 1.0f)) *
    Matrix.CreateRotationZ(this.Rotation) *
    Matrix.CreateTranslation(new Vector3(this.Position, 0));

对于您的父子画面,请包括原点:

代码语言:javascript
复制
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));

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2340303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档