|
本帖最后由 chenwei2007gs 于 2011-3-31 22:19 编辑
程序的大概结构如下
class Parent: //定义继承自osg::MatrixTransform的类
public osg::MatrixTransform
{
public:
Parent(void);
~Parent(void);
public:
void setRotation(osg::Vec3& rot); //定义外板旋转函数
void setPositon(osg::Vec3& pos);
osg::Matrixd* getWorldCoords( osg::Node* node); //用于获得Son自身坐标系相对与世界坐标系的变换矩阵
void update(void); //定义更新函数
Private:
Son* _Son;//继承自PositionAttitudeTransform的类
};
void Parent:arent(void)
{
_Son=new Son;
this->addchild(_son);//添加_son为子节点
_Son->setPosition(pos);
_Son->setRotation(rot);//定义son位置
this->setUpdateCallback(new UpdateCallback());
}
void Parent::update(void)
{
m=getWorldCoords(_Son);获得son在世界坐标系中的位置
m->decompose(temp_tran,temp_rota,temp_sca,temp_so);
R = 5000;//定义Son的旋转半径
angle=angle+pi/30;//定义Son旋转的角度增量
ref_coor._v[0]=0;ref_coor._v[1]=R;ref_coor._v[2]=0;// son绕偏移自身坐标系y方向R处的位置旋转
abs_coor=temp_tran+temp_rota*ref_coor;//定义Son的旋转轴在世界坐标系中位置
mm=osg::Matrix::translate(-abs_coor)*osg::Matrix::rotate(angle,osg::Vec3(0.0,0.0,1.0)) *osg::Matrix::translate(abs_coor);//平移旋转轴
this->setMatrix(mm);
}
如果按上面的update,出来的结果是son在某段区域内正常旋转,而在某段区域将出现跳动,位置变化幅度很大
如果将上面的update修改之后,
void Parent::update(void)
{
osg::ref_ptr<osg::MatrixTransform> mp = new osg::MatrixTransform;
this->addchild(mp);
mp->addchild(_son);
m=getWorldCoords(_Son);获得son在世界坐标系中的位置
m->decompose(temp_tran,temp_rota,temp_sca,temp_so);
R = 5000;//定义Son的旋转半径
angle=angle+pi/30;//定义Son旋转的角度增量
ref_coor._v[0]=0;ref_coor._v[1]=R;ref_coor._v[2]=0;// son绕偏移自身坐标系y方向R处的位置旋转
abs_coor=temp_tran+temp_rota*ref_coor;//定义Son的旋转轴在世界坐标系中位置
mm=osg::Matrix::translate(-abs_coor)*osg::Matrix::rotate(angle,osg::Vec3(0.0,0.0,1.0)) *osg::Matrix::translate(abs_coor);//平移旋转轴
mp->setMatrix(mm);
}
在开头添加osg::ref_ptr<osg::MatrixTransform> mp = new osg::MatrixTransform;this->addchild(mp);mp->addchild(_son);结尾去掉“this->setMatr(mm);”改为mp->setMatrix(mm);改后出现的结果是能正常旋转但会留下阴影
原型
修改后旋转
,
请问这事怎么一回事,能有什么办法去除这些阴影吗,我用removechild试过了,但不行 |
|