4

行列に関する私の知識はゼロに近いので、行列配列から読み取り可能な形式への変換を実行できるヘルパー メソッドを探していました。

読み取り可能な形式とは、次のことを意味します。

{
    translate : 
    {
        x : 0,
        y : 0,
        z : 0
    },

    rotation :
    {
        x : 0,
        y : 90,
        z : 0
    },

    skew :
    {
        x : 0,
        y : 0
    },

    scale :
    {
        x : 0,
        y : 0,
        z : 0
    }
}

マトリックス形式の場合: matrix3d(0.00000000000000006123233995736766, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0.00000000000000006123233995736766, 0, 0, 0, 0, 1).

私はそのような方法をグーグルで探してきましたが、見つけられないようです。

そのような方法はありますか、または利用可能な各軸の各変換タイプを解読/計算するにはどうすればよいですか?

更新:私の友人がhttp://web.iitd.ac.in/~hegde/cad/lecture/L6_3dtrans.pdfに出くわしました。これを調べて、少なくとも何かを取得しようとしています。

4

1 に答える 1

1

行列を元の変換に分解するのは本当に簡単ではありません。なんとかscale*rotate*translate行列を分解できました。

function extract(m) { // supports only scale*rotate*translate matrix
    var radians = Math.PI / 180

    var sX = Math.sqrt(m[0]*m[0] + m[1]*m[1] + m[2]*m[2]),
        sY = Math.sqrt(m[4]*m[4] + m[5]*m[5] + m[6]*m[6]),
        sZ = Math.sqrt(m[8]*m[8] + m[9]*m[9] + m[10]*m[10])

    var rX = Math.atan2(-m[9]/sZ, m[10]/sZ) / radians,
        rY = Math.asin(m[8]/sZ) / radians,
        rZ = Math.atan2(-m[4]/sY, m[0]/sX) / radians

    if (m[4] === 1 || m[4] === -1) {
      rX = 0
      rY = m[4] * -Math.PI/2
      rZ = m[4] * Math.atan2(m[6]/sY, m[5]/sY) / radians
    }

    var tX = m[12]/sX,
        tY = m[13]/sX,
        tZ = m[14]/sX

    return {
      translate: [tX, tY, tZ],
      rotate: [rX, rY, rZ],
      scale: [sX, sY, sZ]
    }
}

ただし、他の変換順序では失敗します。

于 2013-02-23T12:42:49.433 に答える