TRS Export (Translate Rotation Scale)

씬 노드의 매트릭스 정보를 출력한다.

ExportTRS( ) 메쏘드를 보면 다음의 명령어가 있다.

Node TM 구하기 : Matrix3 tmWorld = pNode->GetNodeTM(0)
부모노드 TM 구하기 : Matrix3 tmParent = pNode->GetParentTM(0)
로컬 TM 구하기 : Matrix3 tmLocal = tmWorld * Inverse(tmParent)

Node TM, 부모노드 TM, 로컬 TM 용어 차이에 대해서 알아 본다.

Pivot : Object의 중심점

Local Transform Matrix(LTM) : 부모 Node와 Pivot과의 상대적인 Transform Matrix이다.                                         부모를 기준으로한 Transform Matrix이다.

Node Transform Matrix : 원점을 기준으로 World Transform Matrix이다.

Local TM   X   Parent Node TM = Node TM

Local TM = Node TM   X   Inverse( Parent Node TM )

우리가 얻고자 하는 것은 Local TM이다.

#include <decomp.h>


void ExportTRS(INode* pNode, int iTreeDepth);

void Write(int indent, const Matrix3& tmVal);


void maxPluginTest::Export(INode* pNode, int iTreeDepth /* = 0 */)


    // First step to export: What are we exporting?

    // Here we are going to export the basic scene tree,

    // identifying each node by name.


    MCHAR* pNodeName = pNode->GetName();

    int nChildren = pNode->NumberOfChildren();


    // Write out this node as [NodeName] : XX Children

    Write(iTreeDepth, "[%s] : %i children", pNodeName, nChildren);


    // Write out this nodes local transform

    ExportTRS(pNode, iTreeDepth);


    // Write out this nodes object properties

    ExportObject(pNode, iTreeDepth);


    // Recursively call the children


    for (int i = 0; i < nChildren; i++)


        Export(pNode->GetChildNode(i), iTreeDepth);




void maxPluginTest::ExportTRS(INode* pNode, int iTreeDepth)


    // Export the initial state, that is, at time 0

    Matrix3 tmWorld = pNode->GetNodeTM(0);

    Matrix3 tmParent = pNode->GetParentTM(0);

    Matrix3 tmLocal = tmWorld * Inverse(tmParent);


    Write(iTreeDepth, tmLocal);




void maxPluginTest::Write(int indent, const Matrix3 &tmVal)


    AffineParts apVal;

    float dRotEuler[3];


    decomp_affine(tmVal, &apVal);


    // Convert the rotation quaternion in apVal to rotation euler

    apVal.q.GetEuler(&dRotEuler[0], &dRotEuler[1], &dRotEuler[2]);


    // Write out the position

    Write(indent, "TRS: T (%f, %f, %f)", apVal.t.x, apVal.t.y, apVal.t.z);

    // The Euler rotation

    Write(indent, "    R (%f, %f, %f)", dRotEuler[0], dRotEuler[1], dRotEuler[2]);

    // And finally the scale

    Write(indent, "    S (%f, %f, %f)", apVal.k.x, apVal.k.y, apVal.k.z);


결과: 04trs.txt