中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 4758|回复: 3

关于IGame的几个矩阵问题

[复制链接]
发表于 2013-4-23 14:36:08 | 显示全部楼层 |阅读模式
本帖最后由 jerrywwl 于 2013-4-23 19:02 编辑

IGame有GetLocalTM()、GetObjectTM()、GetWorldTM() 不是很清楚ObjectTM和WorldTM是怎么对应的,文档上也写的不是很清楚

发现 localTM不等于下面等式的
worldTM = localTM * parentWorldTM

我导出的时候,都要自己按照
localTM = worldTM * parentWorldTMInv
用node的worldTM和parent node的worldTM的逆矩阵算一遍,才能得到正确的local matrix


希望大牛能解惑,非常感谢!!
发表于 2013-4-27 18:16:19 | 显示全部楼层
因为年代久远。。。加上如你所说,igame这几个tm构成很诡异,倒不是说原则上有错误,而是在一些特殊的情况下直接取这些数据是有问题的,我已经不太清楚全部的具体的原因所在了,下面是我当下能想到的,以及相关的处理方式:

理论上应该导出object space的vertex等信息,但是直接通过gameMesh->GetVertex,设置ObjectSpace = true的话是有问题的,最好是置为false,然后得到world space的vertex。

原因有两点:一是带skeleton的mesh必须取world space的数据(由美术保证原点在0);二是如果美术在建模时用到模型镜像,那么直接取object space vertex是错误的,所以必须先GMatrix nodeInvWorldTM = gameNode->GetWorldTM().Inverse();然后与每一个world space的vertex进行计算后得到正确的vertex。

至于判断是否为镜像矩阵,需要通过if (tm.Parity() == -1)来知道,然后将tm[2] *= -1;

另外,因为pNode->GetWorldTM(t)非常耗时(估计是通过遍历所有父节点计算得出),所以需要一次性保存处理过的变换矩阵, 以供后续可直接查找使用,否则是会很慢的。这一点主要是因为在导出skeleton信息时,bone的matrix同样需要处理镜像的问题,CS骨骼中是正常的(一次性成形),但如果是skin,美术在构建对称骨架时,为了方便会做一半,另一半通过镜像出来,这时如果不做处理,那么骨骼信息就会错一半。可以说这应该是igame的bug,理论上这些应该是它负责完成的才对,所以必须要自行处理。

因为所有TM都有以上所说的问题,所以通常我都不会直接使用LocalTM,只是在处理法线时,需要通过        bool flipNormal = gameNode->GetLocalTM().Parity() == -1;来判断是否需要翻转法线。

最后,igame应该是fbx的前身,完成度不高,普通情况下使用是没有问题的,但如果美术使用稍微复杂一点的东西,就会有问题。我的印象中直接使用sdk也是有问题的,这些问题max可能在内部计算中处理了,但作为最终面向程序的数据结构,其实是应该处理之后再给出才对,而且现在igame是没有人维护了。不过,这几年在多个游戏应用中填了不少坑,有些情况下还需要直接取INode来处理数据,igame也不能说完全一无是处。而对于fbx,我的认知是,它听上去很美,但实际上各个不同版本的max/maya的支持程度都不一致,其实很难像听上去那样完美跨dcc,所以我没有选择使用fbx。
 楼主| 发表于 2013-5-3 12:59:59 | 显示全部楼层
oiram 发表于 2013-4-27 18:16
因为年代久远。。。加上如你所说,igame这几个tm构成很诡异,倒不是说原则上有错误,而是在一些特殊的情况 ...

感谢大大解惑,原来GetWorldTM是个耗时操作,还有镜像问题,这些以前都没有注意到,我已经把原来的插件代码都改用了igame还以为是给“升级”了,看来完全没必要啊
发表于 2013-5-4 21:00:36 | 显示全部楼层
igame我认为是一个未完成的,或者是没有大规模应用测试的sdk。深入使用会发现接口不够用,否则设计上是不需要暴露如INode这样的原接口的。如果你之前的sdk版本工作正常就不需要转过来,igame适合初学者。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-10-19 22:27 , Processed in 0.041710 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表