查看: 1883|回复: 9

请教视点设置问题

[复制链接]

该用户从未签到

发表于 2012-6-17 11:01:55 | 显示全部楼层 |阅读模式
本帖最后由 redrose007 于 2012-6-17 11:01 编辑

目的:读入物体,得到其在世界坐标系的坐标,并可自己设置视点位置
遇到的问题:
osg::ref_ptr<osg::Node> model= osgDB::readNodeFile("cow.osg");
viewer->setCameraManipulator(new osgGA::TrackballManipulator);

osg::Vec3 eye;
osg::Vec3 center;
osg::Vec3 up;

viewer->getCamera()->getViewMatrixAsLookAt(eye, center, up);
这时候得到的eye(0, 0, 0)    center(0, 0, -1)    up(0, 1, 0)

class GetWorldCoordinateOfNodeVisitor : public osg::NodeVisitor
{
public:
        GetWorldCoordinateOfNodeVisitor():
          osg::NodeVisitor(NodeVisitor::TRAVERSE_PARENTS),done(false)
          {
                  wcMatrix = new osg::Matrixd();
          }
          virtual void apply(osg::Node &node)
          {
                  if (!done)
                  {
                          if (0 == node.getNumParents())
                          {
                                  wcMatrix->set(osg::computeLocalToWorld(this->getNodePath()));
                                  done = true;
                          }
                          traverse(node);
                  }
          }

          osg::Matrixd* giveUpDaMat()
          {
                  return wcMatrix;
          }

private:
        bool done;

        osg::Matrix* wcMatrix;
};

osg::Matrixd* getWorldCoords(osg::Node* node)
{
        GetWorldCoordinateOfNodeVisitor* ncv = new GetWorldCoordinateOfNodeVisitor();

        if (node && ncv)
        {
                node->accept(*ncv);
                return ncv->giveUpDaMat();
        }
        else
        {
                return NULL;
        }
}

osg::Matrixd* mat1;
mat1 = getWorldCoords(model);

这里得到的wcMatrix是单位矩阵,array解释说这个矩阵是从局部坐标系到世界坐标系的变换矩阵,那么,我想得到此时model在世界坐标系的位置如何得到呢

osg::ref_ptr<osg::Node> model= osgDB::readNodeFile("cow.osg");

osg::Matrix cameraPos;
cameraPos.makeLookAt(osg::Vec3(0, -100, 0), osg::Vec3(0, 0, 0), osg::Vec3(0, 0, 1));
viewer->getCamera()->setViewMatrix(cameraPos);

osg::Vec3 eye;
osg::Vec3 center;
osg::Vec3 up;

viewer->getCamera()->getViewMatrixAsLookAt(eye, center, up);
这时候得到的eye(0, -100, 0)    center(0, -99, 0)    up(0, 0, 1)  ,这时候center位置是怎么回事

osg::Matrixd* mat1;
mat1 = getWorldCoords(viewer->getCamera());
这时候得到的wcMatrix还是单位矩阵,我想知道这时候相机位置到底在哪

请大家明白的帮忙解答一下,谢谢大家!

该用户从未签到

发表于 2012-6-20 12:59:29 | 显示全部楼层
我在另一个帖子里已经回复您了,我怀疑您自己写的Visitor有问题,可以直接用getWorldMatrices实验

该用户从未签到

发表于 2012-6-20 13:01:13 | 显示全部楼层
至于您的第二个问题,很简单。ViewMatrix中是不包含center的信息的,事实上LookAt中的center本来就是一个辅助得到lookDir的参数,ViewMatrix中会保存观察的方向而非观察点,因此您重新getLookAt的时候,默认观察点就是观察方向上1个单位距离的点,您可以通过第四个参数来调节

该用户从未签到

 楼主| 发表于 2012-6-20 23:06:21 | 显示全部楼层
array 发表于 2012-6-20 13:01
至于您的第二个问题,很简单。ViewMatrix中是不包含center的信息的,事实上LookAt中的center本来就是一个辅 ...

非常感谢您的解答,您提到的那个函数我会去实验一下,关于第二个问题的解答还不是很明白,不过这两天看了很多坐标系方面的东西,需要再理解理解!

该用户从未签到

发表于 2012-6-21 08:00:35 | 显示全部楼层
redrose007 发表于 2012-6-20 23:06
非常感谢您的解答,您提到的那个函数我会去实验一下,关于第二个问题的解答还不是很明白,不过这两天看了 ...

center-eye 确定了观察坐标系中的Z轴,而后又经过了normal,所以不管center设置的是多远只要是都是在一条直线上,效果都是一样的

该用户从未签到

发表于 2012-6-22 17:24:21 | 显示全部楼层
哈,作者该不会还没有把model节点挂到场景中去,就直接调用getWorldCoords函数来获取model的变换矩阵了吧。。。

该用户从未签到

发表于 2012-6-22 20:23:43 | 显示全部楼层
本帖最后由 buaahc 于 2012-6-22 20:24 编辑

getLookAt(Vec3f& eye,Vec3f& center,Vec3f& up,value_type lookDistance=1.0f)其实这个函数有四个参数,因为第四个参数默认=1 所以你得到是(0,-99,0)

该用户从未签到

发表于 2012-6-22 20:27:12 | 显示全部楼层
array 发表于 2012-6-20 12:59
我在另一个帖子里已经回复您了,我怀疑您自己写的Visitor有问题,可以直接用getWorldMatrices实验

我想知道这时候相机位置到底在哪?

array第三个问题答案是什么?

该用户从未签到

发表于 2012-6-25 10:30:08 | 显示全部楼层
相机位置是通过setViewMatrix()来决定的,即观察矩阵的逆矩阵

该用户从未签到

 楼主| 发表于 2012-6-26 10:08:26 来自手机 | 显示全部楼层
buaahc 发表于 2012-6-22 20:23  getLookAt(Vec3f& eye,Vec3f& center,Vec3f& up,value_type lookDistance=1.0f)其实这个函数有四个参数,因 ...

嗯,明白了,谢谢解答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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