查看: 1914|回复: 3

视点定位问题(附编程思路)

[复制链接]

该用户从未签到

发表于 2010-4-13 16:46:06 | 显示全部楼层 |阅读模式
根据已有成果编写了控制漫游器类RoamManipulator,其中由成员变量m_vPositionm_vRotation分别控制摄像机位置和姿态。
问题是:如何根据确定的位置和姿态角值将摄像机定位到确定的位置,即怎么实现视点定位?下面附带编写思路:
osg::Vec3 m_vPosition;
osg::Vec3 m_vRotation;
在类RoamManipulator中,重载虚函数setByMatrix()setByInverseMatrix(),在源文件中

void RoamManipulator::setByMatrix(const osg::Matrixd&matrix)

{//设置矩阵(空)
}
void RoamManipulator::setByInverseMatrix(const osg::Matrixd&matrix)
{//设置逆矩阵(空)
}

视点定位点击相应后执行以下代码,但是点击后视点位置和姿态没有发生变化,不知为何,请群内兄弟分析一下。谢谢。
osg::ref_ptr<osgViewer::Viewer> mViewer = (osg::ref_ptr<osgViewer::Viewer>)mOSG->mViewer;
       RoamManipulator* camera = (RoamManipulator*)mViewer->getCameraManipulator();
       FILE* pFile = NULL;
       osg::Vec3 position ;
       osg::Vec3 rotation ;
       pFile = fopen("camera.dat","r");//从文件中读取摄像机的位置positionrotation
       if(pFile==NULL){
              AfxMessageBox("文件打开失败!");
              return;

}
       fscanf(pFile,"%lf %lf %lf %lf %lf %lf",&position.x(),&position.y(),&position.z(),&rotation.x(),&rotation.y(),&rotation.z() );
       fclose(pFile);
       osg::Matrixd myCamMatrix;
       osg::Matrixd camRotation;
       osg::Matrixd camPosition;
       camRotation.makeRotate(rotation.x(),osg::Vec3(1.0,0.0,0.0),
              rotation.y(),osg::Vec3(0.0,1.0,0.0),
              rotation.z(),osg::Vec3(0.0,0.0,1.0));
       camPosition.makeTranslate(position.x(),position.y(),position.z());
       myCamMatrix = camRotation * camPosition;
       osg::Matrixd i = myCamMatrix.inverse(myCamMatrix);
camera->setByInverseMatrix(osg::Matrixd(i.ptr())*osg::Matrix::rotate(-osg::PI_2,1,0,0));

该用户从未签到

发表于 2010-4-14 08:11:38 | 显示全部楼层
我不知道您做了什么,既然RoamManipulator是您自己的派生类,那么最重要的是重写它的getMatrix()和getInverseMatrix()函数,这两者分别用于设置当前的相机位置矩阵和观察矩阵,系统内部会自动调用它们并作用于系统主相机

如果您没有重写这两个函数,那么漫游器本身不会产生任何效果

该用户从未签到

 楼主| 发表于 2010-4-14 10:33:40 | 显示全部楼层
2# array

谢谢array。是对setByMatrix和setByInverseMatrix函数编写代码吧。

该用户从未签到

发表于 2010-4-14 12:32:26 | 显示全部楼层
是对setByMatrix和setByInverseMatrix函数编写代码吧
重写它的getMatrix()和getInverseMatrix()函数!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表