2010-02-26 7 views
4

내가 원하는 것은 매트릭스를 SpriteBatch로 푸시 (push)하고 팝 (pop) 할 수 있다는 것입니다. 나는 부모와 자식으로 이루어진 2 개의 스프라이트를 가지고 있으며, 그 자식은 부모에 대해 상대적으로 크기를 조정하고, 회전시키고, 번역해야합니다.Xna SpriteBatch Matrix.Decompose()

저는 현재 텍스처가있는 사각형을 사용하여 구현되었지만 내장 된 SpriteBatch 클래스를 사용하고 Matrix.Decompose()를 사용하여 가능해야한다고 생각합니다. SpriteBatch에 분해 된 값을 전달하는 방법을 잘 모르겠습니다.

매트릭스 스택을 유지하는 방법을 알고 있습니다. Matrix.Decompose()에서 오는 값을 SpriteBatch와 함께 사용하는 예제를 찾고 있습니다.

답변

4

마지막으로 나 자신을 알아 냈습니다. 대부분의 신용은이 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); 
} 

당신은 다음과 같이 변환 매트릭스 당신의 잎 스프라이트를 구축 할 수 있습니다 :

부모 스프라이트를 들어
Matrix transform = 
    Matrix.CreateScale(new Vector3(this.Scale, 1.0f)) * 
    Matrix.CreateRotationZ(this.Rotation) * 
    Matrix.CreateTranslation(new Vector3(this.Position, 0)); 

가 원점을 포함 :

스택의 모든 행렬을 역순으로 곱하십시오.

+0

저는 변환 매트릭스의 쿼터니언을 SpriteBatch가 사용할 수있는 플로트로 변환하는 방법을 계속 살펴 보았습니다. 이것이 절대적으로 그렇습니다. 이것을 알면 matrix.Decompose (...)가 bool을 반환한다는 것을 알 수 있습니다. if 문에 넣는 것은 권장하지 않습니다. 그것은 나를 위해 무엇이든지 false를 반환하는 것처럼 보였지만 크기, 회전 및 위치에 대한 올바른 값을 출력합니다. – BrettMStory

관련 문제