【问题标题】:Decomposing a matrix into scale, rotation, and translation with haskell使用haskell将矩阵分解为缩放、旋转和平移
【发布时间】:2017-06-05 14:47:21
【问题描述】:

我正在尝试使用 haskell 将矩阵分解为 3x3 旋转矩阵、缩放向量和平移向量。我正在使用linear 包中的矩阵。不幸的是,该包仅导出用于从缩放、旋转和平移生成矩阵的函数,而不是从矩阵中提取这些函数。因此,我决定自己写一个函数来做。

但是,即使我使用的矩阵没有缩放,我的函数返回的缩放向量不是V3 1.0 1.0 1.0

import qualified Linear.Matrix     as LA
import qualified Linear.V4         as LA
import qualified Linear.V3         as LA
import qualified Linear.Vector     as LA
import qualified Linear.Quaternion as LA

import Control.Lens hiding (deep)

...

decomposeMatrix :: LA.M44 Double -> (LA.M33 Double, LA.V3 Double, LA.V3 Double)
decomposeMatrix m = (rot, scale, trans)
    where trans = (m ^.LA.column LA._w ^. LA._xyz)
          scale = LA.V3 sx sy sz
          sx    = vecLength (m ^.(LA.column LA._x) ^. LA._xyz)
          sy    = vecLength (m ^.(LA.column LA._y) ^. LA._xyz)
          sz    = vecLength (m ^.(LA.column LA._z) ^. LA._xyz)
          rot   = LA.V3 ((m ^. (LA.column LA._x) ^.LA._xyz) LA.^/ sx)
                        ((m ^. (LA.column LA._y) ^.LA._xyz) LA.^/ sy)
                        ((m ^. (LA.column LA._z) ^.LA._xyz) LA.^/ sz)

vecLength :: LA.V3 Double -> Double
vecLength (LA.V3 a b c) = sqrt (a*a + b*b + c*c)

这是我在 ghci 中运行此功能的方式:

decomposeMatrix $ LA.mkTransformation (LA.Quaternion 1 (LA.V3 1 2 3)) $ LA.V3 1 2 3

这就是我得到的结果(格式化以便您更容易阅读):

(V3 (V3 (-0.9259259259259259) 0.37037037037037035 7.407407407407407e-2)
    (V3 (-8.444006618414981e-2) (-0.8021806287494233) 0.5910804632890487) 
    (V3 0.5965499862718936 0.5965499862718936 (-0.5368949876447042)),
V3 27.0 23.68543856465402 16.76305461424021,
V3 1.0 2.0 3.0)

提前致谢。

【问题讨论】:

    标签: haskell matrix linear-algebra


    【解决方案1】:

    你的decomposeMatrix 函数看起来不错(除了旋转矩阵是从你想要的转置的)。

    最大的问题是您的测试用例:您使用的四元数 (LA.Quarternion 1 (LA.V3 1 2 3) 不是单位四元数,因此 LA.mkTransformation 没有构建纯旋转。它正在构建旋转和缩放的组合。试试这个例子:

    decomposeMatrix $ LA.mkTransformation (LA.axisAngle (LA.V3 1 2 3) 1) 
                    $ LA.V3 1 2 3
    

    它使用LA.axisAngle 构建一个单位四元数,表示来自矢量和角度的纯旋转,它会按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多