来看代码
.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()函数。它们应该放在所有函数外部,位于文件范围或全局范围内。
如图是我放的位置
然后就可以编译不报错啦!大功告成