来看代码
.h文件中
static void computePosition(const osg::Vec3d& eye,const osg::Vec3d& lv,const osg::Vec3d& up);
void setEye(const osg::Vec3d& eye);
void setRotation( const osg::Quat& rotation );osg::Vec3d _eye;
osg::Quat _rotation;.cpp文件中
void DriveManipulator::computePosition(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up)
{osg::Vec3d lv = center-eye;osg::Vec3d f(lv);f.normalize();osg::Vec3d s(f^up);s.normalize();osg::Vec3d u(s^f);u.normalize();osg::Matrixd rotation_matrix(s[0], u[0], -f[0], 0.0,s[1], u[1], -f[1], 0.0,s[2], u[2], -f[2], 0.0,0.0, 0.0, 0.0, 1.0);setEye(eye);setRotation(rotation_matrix.getRotate().inverse());}void DriveManipulator::setEye(const osg::Vec3d& eye) {_eye = eye;
}void DriveManipulator::setRotation(const osg::Quat& rotation) {_rotation = rotation;
}
但是会报错,说引用错误。
这是因为把computePosition函数定义为static
引起的。
解决办法:
computePosition函数定义为static
不能更改了(我的代码需求,static必须存在),所以要在它内部使用,需要把其它函数也改成静态的。
更改如下:
.h文件static void setEye(const osg::Vec3d& eye);static void setRotation( const osg::Quat& rotation );static osg::Vec3d _eye;static osg::Quat _rotation;.cpp文件
osg::Vec3d DriveManipulator::_eye;
osg::Quat DriveManipulator::_rotation;
关于.cpp文件那两行应该放在哪里,因为在类声明中声明了静态成员变量_eye和_rotation,需要在类定义文件(.cpp文件)中为它们分配存储空间。这两行代码不能放在任何函数内部,包括main()函数。它们应该放在所有函数外部,位于文件范围或全局范围内。
如图是我放的位置
然后就可以编译不报错啦!大功告成