2016-09-11 211 views
0

我目前使用3×2矩阵(称为Transform),这样产生的:如何将3x2矩阵转换为4x4矩阵?

private void CalculateTransform() 
{ 
    _positionToOriginOffset = _position - _origin; 

    if (_positionToOriginOffset.X < 0.0f) 
     _positionToOriginOffset.X = 0.0f; 
    if (_positionToOriginOffset.Y <= _maxY) 
     _positionToOriginOffset.Y = _maxY; 
    if (_positionToOriginOffset.Y > 0.0f) 
     _positionToOriginOffset.Y = 0.0f; 

    Transform = SimpleMatrix3x2.Identity; 

    if (_zoom != 1.0f || _rotation != 0.0f) 
    { 
     Transform = 
       SimpleMatrix3x2.CreateTranslation(-Position) * 
       SimpleMatrix3x2.CreateScale(_zoom) * 
       SimpleMatrix3x2.CreateRotation(_rotation) * 
       SimpleMatrix3x2.CreateTranslation(Position); 
    } 

    Transform *= SimpleMatrix3x2.CreateTranslation(-_positionToOriginOffset); 
} 

public static SimpleMatrix3x2 CreateTranslation(SimpleVector2 position) 
{ 
    SimpleMatrix3x2 result; 

    result.M11 = 1.0f; 
    result.M12 = 0.0f; 
    result.M21 = 0.0f; 
    result.M22 = 1.0f; 

    result.M31 = position.X; 
    result.M32 = position.Y; 

    return result; 
} 

如何转换一个3x2的矩阵分为4x4?

public static Matrix ToMatrix4x4(SimpleMatrix3x2 matrix) 
{ 
    return new Matrix(...); ? 
} 

Matrix类是从Microsoft.Xna.Framework,它是一个4×3矩阵。

回答

3

以编程方式来说,XNA矩阵类表示一个4x4矩阵。它有一个构造函数,它有16个值(m11,m12,...,m44),所以你可以简单地将你的值传递给它。

从数学上讲,3d变换矩阵的最后一列应该包含(0,0,0,1)。第二个应该有(0,0,1,0),基于你从一个2d变换矩阵转换的事实。总的来说,它应该看起来像这样:

return new Matrix(m.11, m.12, 0, 0, 
        m.21, m.22, 0, 0, 
        0, 0, 1, 0, 
        m.31, m.32, 0, 1); 

希望有所帮助!