MAX SDK 的 INode 的变换矩阵,以及 Object 的一些常识
转 http://blog.csdn.net/Nhsoft/archive/2005/01/06/241629.aspx
MAX SDK 中,INode 是很重要的一个部分。 几乎所有的东西都需要通过 INode 来访问:Mesh
Camera 等.
下面我来简单的介绍一下和 INode 相关的各种不同的 TM.(Transformation Matrix).仅仅代表
我近日阅读 MAX SDK 的一些理解.希望高手指教.新手讨论.
首先是介绍一下 Node 和 Object(Mesh TriObject 等).
MAX 里 的 Scene 是 由 INode 构 成 的 , Node 里 包 含 很 多 东 西 . 这 个 Node 可 能 是 可 以
Deform(变形)的,或者是不可以 Deform 的。如常见的 Editable Mesh 和 Cylinder 一类的东西
是可以 Deform 的 Node. 而 Camera 是不可以 Deform 的。
一个包含了几何物体的 Node(就是可以转化为 GeomObject 的)中的几何体并不是 Node 本身.
而是 Node 中的 Object . 这个 Object 可能是一个 Derived Object( 表 示这个 Object 从别的
Object 那里派生出来,通常是从上一个修改器(Modifier)的结果那里派生的). 同时还附加了一
些 Modefier 每个 Modifer 的修改结果都是一个 Deried Object .而类似 Pyhsique 的修改器都是
作用在 Derived Object 上.因此,要找一个 Node 有没有 Pyhsique 的修改器,需要通过 Derived
Object 来得到.
INode->GetObjectRef()可以得到这个物体的 Object .
Object->SuperClassID() == GEN_DERIVED_CLASS_ID 的话 , 就表示 这 个 Object 是 一 个
Derived Object .
DerivedObject->GetObjectRef()得到这个这个 Derived Object 是从那个 Object 派生出来的..
用上面三个函数.可以遍历一个 Node 从创建到形成这个 Node,所有经过的 Derived Object.
如果要得到这个 Node 上最终的 Object 的状态(ObjectState.它包含了 Node 的 Object). 只要调
用 INode->EvalWorldState()就可以了。
下面.我来介绍 Node 里容易引起混淆的几个 TM.
INode->GetNodeTM().: NodeTM()只包含了 Node 的 TM.不是物体的 TM. 每个 Node 都有个
基准点(Pivot Point). 这个 Pivot Point 在世界坐标中的状态,就是这个 Node 的 TM. 而附加在这
个 Node 上的 Object 相对这个 Pivot Point 可能会有其他的变换(平一,旋转等). 所以.NodeTM
不能用来变换 Object.
INode->GetParentTM(). 父节点的 TM.我们说过 NodeTM 是在世界坐标中的。所以,要得到节
点相对父节点的 TM 需要 GetNodeTM()*Inverse(GetParentTM()).
INode->GetObjectTM(). 用这个矩阵,可以把 Node 中的 Object 变换到世界空间来.
其实 GetObjectTM() = NodeTM() * (Object 相对于 Node 的变换).
INode->GetObjTMAfterWSM() : WSM 的意思是 World Space Modifer. Modifer 有两中,一种是