|
楼主 |
发表于 2011-7-13 20:04:06
|
显示全部楼层
对于Z方向的移动我做了个试验,试验对象包围盒在世界坐标系中值为(zMin,zMax)=(34.36,36.319),在回调中改变spreaderPat节点的Z坐标(-3.27个单位),分四种情况讨论:
1 变换节点应用访问器,代码如下:
spreaderPat->accept(*spreaderCBV);
//注意从父节点计算
osg::Matrix localToWorld=osg::computeLocalToWorld(spreaderPat->getParent(0)->getParentalNodePaths()[0]);
localToWorld矩阵的值如下
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
通过spreaderBB=spreaderCBV->getBoundingBox();计算得到经过平移转换后的
(zMin,zMax)=(31.087,36.319),由于localToWorld的32元素为0,因此包围盒的高度变为5.232,明显不对。
2 变换节点应用访问器,代码如下:
spreaderPat->accept(*spreaderCBV);
//注意从当前PAT节点计算
osg::Matrix localToWorld=osg::computeLocalToWorld(spreaderPat->getParentalNodePaths()[0]);
localToWorld矩阵的值如下
1 0 0 0
0 1 0 0
0 0 1 0
0 0 -3.27 1
通过spreaderBB=spreaderCBV->getBoundingBox();计算得到经过平移转换后的
(zMin,zMax)=(31.087,36.319),由于localToWorld的32元素为-3.27,
与矩阵相乘后为(27.81,33.05),因此包围盒的高度依然是5.232,还是不对。
3 PAT中的node节点应用访问器,代码如下:
osg::Node* node=spreaderPat->getChild(0);
node->accept(*spreaderCBV);
//注意从父节点PAT计算
osg::Matrix localToWorld=osg::computeLocalToWorld(node->getParent(0)->getParentalNodePaths()[0]);
localToWorld矩阵的值如下
1 0 0 0
0 1 0 0
0 0 1 0
0 0 -3.27 1
通过spreaderBB=spreaderCBV->getBoundingBox();计算得到经过平移转换后的
(zMin,zMax)=(34.36,36.319),由于localToWorld的32元素为-3.27,
与矩阵相乘后为(31.087,33.046),因此包围盒的高度是1.959,完全正确,即包围盒性状不变,高度下降。
4 PAT中的node节点应用访问器,代码如下:
osg::Node* node=spreaderPat->getChild(0);
node->accept(*spreaderCBV);
//注意从当前节点node计算
osg::Matrix localToWorld=osg::computeLocalToWorld(node->getParentalNodePaths()[0]);
localToWorld矩阵的值如下
1 0 0 0
0 1 0 0
0 0 1 0
0 0 -3.27 1
通过spreaderBB=spreaderCBV->getBoundingBox();计算得到经过平移转换后的
(zMin,zMax)=(34.36,36.319),由于localToWorld的32元素为-3.27,
与矩阵相乘后为(31.087,33.046),因此包围盒的高度依然是1.959,完全正确。 |
|