查看: 2515|回复: 18

物体观察视角的调整的问题

[复制链接]

该用户从未签到

发表于 2010-8-5 17:14:44 | 显示全部楼层 |阅读模式
我想做一个道理的漫游器,道路是一件做好的.ive模型,由于这个模型在osgviewer中显示的时候离视线很远,我想做漫游开始时先把相机定位到道路上的某个点上面,方便清楚的看到效果,然后再开始漫游,我用MatrixTransform对位置进行调整,用translate来改变观察物体的位置,但得不到好的效果,就是我用了translate设置y值为负数来使物体向相机移动,但好像没用,是不是在移动物体的时候相机也移动了???然后我想到把物体放大可能会有用,用scale改变物体的尺寸,但还是不行,后来也使了下调整相机的一些操作,还是没能得到还的效果,感觉osg还没入门,这些东西做起来有点困难,请高手不吝赐教,万分感激.

该用户从未签到

发表于 2010-8-5 17:24:19 | 显示全部楼层
也许直接将相机移动到道路上比较直观一些,方便编程。

该用户从未签到

 楼主| 发表于 2010-8-5 17:36:18 | 显示全部楼层
2# yin_savage
请问怎么样直接把相机移动到道路上啊???请您指导下吧

该用户从未签到

发表于 2010-8-5 17:42:29 | 显示全部楼层
本帖最后由 aya_daxiang 于 2010-8-5 17:44 编辑

海军教程
http://bbs.osgchina.org/thread-6-1-1.html

第十颗第一节

http://www.osgchina.org/projects ... s/CameraControl.php

该用户从未签到

 楼主| 发表于 2010-8-5 18:03:46 | 显示全部楼层
4# aya_daxiang
我用的osg-2.8.2-vc80sp1版本好像没有了osgProducer这个库了,不知道能不能给我发下这个库,而且里面有些东西也不是很懂,谢谢你们的指导,我再去仔细的看下。

该用户从未签到

发表于 2010-8-5 18:23:22 | 显示全部楼层
5# answer1103

producer 是很早以前版本里的东西,那两个例子只是让您看一看得,具体做法需要改变一下。您需要的效果这样做一下应该就可以了:
osg::Matrixd myCameraMatrix;

       osg::Matrixd cameraRotation;
       osg::Matrixd cameraTrans;
       cameraRotation.makeRotate(
          osg:egreesToRadians(-20.0), osg::Vec3(0,1,0), // 滚转角(Y轴)
          osg::DegreesToRadians(-15.0), osg::Vec3(1,0,0) , // 俯仰角(X轴)
          osg::DegreesToRadians( 10.0), osg::Vec3(0,0,1) ); // 航向角(Z轴)

       // 相机位于坦克之后60个单元,之上7个单元。
       cameraTrans.makeTranslate( 10,-50,15 );


       myCameraMatrix = cameraRotation * cameraTrans;

你如果有添加manipulator的话,就这样:
osg::Matrixd i = myCameraMatrix.inverse(myCameraMatrix);
viewer.getCameraManipulator()->setByInverseMatrix(  osg::Matrix(i.ptr() ) *osg::Matrix::rotate( -osg:I/2.0, 1, 0, 0 ));

应该就可以啦。

该用户从未签到

发表于 2010-8-5 18:24:11 | 显示全部楼层
第一个笑脸是: D,第二个市 :P

该用户从未签到

 楼主| 发表于 2010-8-5 20:30:28 | 显示全部楼层
7# aya_daxiang

太感激您了,这么耐心的帮助我,谢谢

该用户从未签到

 楼主| 发表于 2010-8-6 09:23:41 | 显示全部楼层
6# aya_daxiang
您好,我用您的方法试了下,但相机还是没有移动,我现在单纯想完成的就是把相机固定到场景中的某个点上面去,但不知道怎么实现,还有您所说的添加manipulation是哪个manipulation?好像没有添加manipulation就会出错,您能再给我解释下吗?多谢了。

该用户从未签到

发表于 2010-8-6 11:00:17 | 显示全部楼层
添加 5# answer1103  的代码前,先添加manipulation,
代码viewer.setCameraManipulator( new osgGA::TrackballManipulator );
这样相机应该会移动了,你试一下。

该用户从未签到

发表于 2010-8-6 11:10:07 | 显示全部楼层
哦,我还以为你添加了manipulator...如果没有的话,把
viewer.getCameraManipulator()->setByInverseMatrix(  osg::Matrix(i.ptr() ) *osg::Matrix::rotate( -osg:I/2.0, 1, 0, 0 ));
换成
viewer.getCamera()->setViewMatrix(  osg::Matrix(i.ptr() ) *osg::Matrix::rotate( -osg:I/2.0, 1, 0, 0 ));
应该就可以了吧?

该用户从未签到

 楼主| 发表于 2010-8-6 13:07:40 | 显示全部楼层
11# aya_daxiang
我给您看下我的代码:
  1.         osg::ref_ptr<osg::Node>node=osgDB::readNodeFile("road.ive");
  2.         ///其实相对于我的程序,这里只需要cameraTrans就可以了
  3.         osg::Matrixd CameraMatrixd;
  4.         osg::Matrixd cameraTrans;
  5.         osg::Matrixd cameraRotate;

  6.         cameraTrans.makeTranslate(-5035.37, -3843.1 ,751.109);
  7.         cameraRotate.makeRotate(osg::DegreesToRadians(30.0),0,0,1);
  8.         CameraMatrixd=cameraTrans*cameraRotate;
  9.         osg::Matrixd i=CameraMatrixd.inverse(cameraTrans);
  10.         viewer->getCamera()->setViewMatrix(osg::Matrix(i.ptr()));

  11.         //viewer->setCameraManipulator(new osgGA::TrackballManipulator);
  12.         //viewer->getCameraManipulator()->setByInverseMatrix(osg::Matrix(i.ptr()));
复制代码

其中Vec3(-5035.37, -3843.1 ,751.109);是我从道路上取出来的一个点,我的漫游器从这个点开始,然后想在开始漫游的时候让视线定位到这个点上来,请您们再帮我看看,谢谢啦

该用户从未签到

 楼主| 发表于 2010-8-6 13:08:42 | 显示全部楼层
10# anlingbin
谢谢您,我试了下,但还是没有我想要的结果。

该用户从未签到

发表于 2010-8-6 13:21:24 | 显示全部楼层
您需要这样做setViewMatrix(  osg::Matrix(i.ptr() ) *osg::Matrix::rotate( -osg:: PI/2.0, 1, 0, 0 ));
后面这个的目的是:“除了求取逆矩阵之外,我们还需要提供世界坐标系的方向。通常osgGA::MatrixManipulator矩阵(osgProducer::Viewer中使用)使用的坐标系为Z轴向上。但是Producer和osg::Matrix(也就是上文所创建的)使用Y 轴向上的坐标系系统。因此,在获得逆矩阵之后,我们需要将其从Y轴向上旋转到Z轴向上的形式。这一要求可以通过沿X轴旋转-90度来实现。”
得到您想要的效果了么?如果还没有,请具体说以下问题是什么好么?

该用户从未签到

 楼主| 发表于 2010-8-6 14:03:25 | 显示全部楼层
14# aya_daxiang
pic.zip (78.69 KB, 下载次数: 134)

该用户从未签到

发表于 2010-8-6 14:26:03 | 显示全部楼层
emm,那你现在的效果是什么样的呢?你在程序里面有没有添加manipulator?
"viewer.setCameraManipulator(...)"

该用户从未签到

 楼主| 发表于 2010-8-6 14:38:46 | 显示全部楼层
16# aya_daxiang
现在的效果跟其中的第一副图几乎一样,也就是添加了那些代码后几乎对模型的位置没有改变,然后那个manipulator添加了,但也没有效果,郁闷啊。。。

该用户从未签到

发表于 2010-8-6 15:12:51 | 显示全部楼层
manipulator会自动调整camera的初始位置,所以你需要用
viewer.getCameraManipulator()->setByInverseMatrix(  osg::Matrix(i.ptr() ) *osg::Matrix::rotate( -osg:: PI/2.0, 1, 0, 0 ));
而不是
viewer->getCamera()->setViewMatrix(...)

该用户从未签到

 楼主| 发表于 2010-8-6 19:48:44 | 显示全部楼层
18# aya_daxiang

谢谢您这么耐心的给我指导。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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