zoukankan      html  css  js  c++  java
  • TRS矩阵分解

    transform = TRS

    T就是transform的最后一列。关于R和S的分解,PBRT给了一个公式:M_(i+1) = (M_i + ((M_i)^T)^(-1))*0.5,直到M收敛。M初始状态为transform左上角的3*3的矩阵。

    M收敛后得到的矩阵为R,从而可以解出S.代码大概是这样:

            void decompose(Vec3<float>& T, Mat33<float> &R, Vec3<float>& S) {
                T[0] = m[0][3], T[1] = m[1][3], T[2] = m[2][3];
    
                Mat33<float> M0 = *this;
                while (true) {
                    auto M1 = (M0 + M0.transpose().inverse()) * 0.5;
                    if (M0.equals(M1)) break;
                    M0 = M1;
                }
    
                R = M0;
    
                _RUNTIME_ASSERT_((M0*M0.transpose()).equals(Mat33<float>::eye()), "(M0*M0.transpose()).equals(eye())");
    
                auto SM = R.transpose() * Mat33<float>(*this);
                S[0] = SM[0][0], S[1] = SM[1][1], S[2] = SM[2][2];
            }

    还有一种方法?:简单验证了下,如果transform 是由TRS得到的,二者恢复出来的是一样的,但TSR就不一样了?

    S是前三列的magnitude。R根据第三列forward,第二列upward恢复。

    https://answers.unity.com/questions/402280/how-to-decompose-a-trs-matrix.html

  • 相关阅读:
    阅读笔记
    学习小记
    networkx学习笔记
    ORM查询简化
    redis等缓存
    redis相关缓存知识
    Centos7网络配置
    redis安装详细
    redis安装详细
    mobaxterm使用手册
  • 原文地址:https://www.cnblogs.com/redips-l/p/10796243.html
Copyright © 2011-2022 走看看