查看: 2032|回复: 14

坐标轴角标问题

[复制链接]

该用户从未签到

发表于 2011-11-11 17:21:09 | 显示全部楼层 |阅读模式
本帖最后由 osg3d 于 2011-11-11 17:23 编辑

想实现如下坐标轴角标,就是在场景左下角显示一个表示当前场景坐标轴向,它只是对相机旋转有反应,对场景缩放和移动不起效果,采取方法:将一个坐标轴模型节点放在一个Projection下或放在Matrixtransform下设置为绝对坐标模式,然后在回调中剔除移动变换,可行否?有没有更好的方法? 捕获.PNG

该用户从未签到

发表于 2011-11-11 17:33:26 | 显示全部楼层
这个论坛里早就有了呀 你直接搜索一下吧

该用户从未签到

 楼主| 发表于 2011-11-11 17:43:41 | 显示全部楼层
搜不到,没有相应解决方案,补充,选装场景时那个坐标轴模型始终沿坐标轴模型原点位置旋转。

该用户从未签到

 楼主| 发表于 2011-11-11 17:46:31 | 显示全部楼层
找到了

该用户从未签到

 楼主| 发表于 2011-11-11 18:12:33 | 显示全部楼层
virtual bool computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const
                {
                        osg::Matrixd mat;
                       
                        mat.makeRotate(_matrix.getRotate());

                        if (_referenceFrame==RELATIVE_RF)
                        {
                                matrix.preMult(mat);
                        }
                        else // absolute
                        {
                                matrix = mat;
                        }
                        return true;
                }

                virtual bool computeWorldToLocalMatrix(Matrix& matrix,NodeVisitor*) const
                {
                        const Matrix& inverse = getInverseMatrix();

                        osg::Matrixd mat;

                        mat.makeRotate(inverse.getRotate());

                        if (_referenceFrame==RELATIVE_RF)
                        {
                                matrix.postMult(mat);
                        }
                        else // absolute
                        {
                                matrix = mat;
                        }
                        return true;
                }
重载这两个函数让其只接受旋转参数,为何不起作用?

该用户从未签到

 楼主| 发表于 2011-11-11 18:25:56 | 显示全部楼层
本帖最后由 osg3d 于 2011-11-11 18:26 编辑

class MatUpdateCallback : public osg::NodeCallback
{
        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
        {

                osg::MatrixTransform* mt=dynamic_cast<osg::MatrixTransform*>(node);
                if (mt!= NULL)
                {
                        osg::Matrixd mat;
                        mat.makeRotate(mt->getMatrix().getRotate());

                        mt->setMatrix(mat);
                }


                traverse(node,nv);
                //std::cout<<"update callback - post traverse"<<node<<std::endl;
        }
};
这样用回调也不行,何故?哪不对?

该用户从未签到

 楼主| 发表于 2011-11-11 18:36:00 | 显示全部楼层
跟踪后上面的mat都是单位矩阵,操作场景对其不产生影响,想了想应该是操作场景只是变了相机的矩阵,但模型相对相机矩阵没有变化,所以上面的mat最终结果都是单位阵。那究竟该如何修改?请高手赐教。参照
http://bbs.osgchina.org/forum.ph ... =%D7%F8%B1%EA%D6%E1

该用户从未签到

发表于 2011-11-12 09:41:08 | 显示全部楼层
我自己的实现方法是,把坐标轴加在具有视口的摄影机下,根据主摄影机的相机矩阵来计算视点的前向和上向量,由于坐标轴摄影机的视点中心固定总是坐标轴位置,然后就可以根据中心位置和前向以及上向量即可推算出坐标轴摄影机的视图矩阵

该用户从未签到

发表于 2011-11-12 10:40:42 | 显示全部楼层
跟踪旋转,不跟踪缩放,应该是这样吧~~~~~·

该用户从未签到

发表于 2011-11-21 12:28:39 | 显示全部楼层
fenma3422 发表于 2011-11-12 09:41
我自己的实现方法是,把坐标轴加在具有视口的摄影机下,根据主摄影机的相机矩阵来计算视点的前向和上向量, ...

请问下,如果在场景节点为空的情况下,坐标轴X的指示方向对吗?

该用户从未签到

发表于 2011-11-22 12:15:32 | 显示全部楼层
场景为空的时候不受影响,这里是根据视图矩阵进行的计算,只要视图矩阵没问题不是奇异的,结果应该总是正确的

该用户从未签到

发表于 2011-11-22 12:15:38 | 显示全部楼层
场景为空的时候不受影响,这里是根据视图矩阵进行的计算,只要视图矩阵没问题不是奇异的,结果应该总是正确的

该用户从未签到

发表于 2015-6-30 10:24:28 | 显示全部楼层
您好,这个网址我打不开了,
http://115.com/file/bwhxluof#
axes.rar
请问可以发我邮箱吗
lxqiang87@126.com
就是左下角坐标箭头的实现,谢谢!

该用户从未签到

发表于 2015-7-16 09:31:45 | 显示全部楼层
lxqiang87,

能否把坐标轴的例子发给我看看。justin713@126.com。谢谢!

该用户从未签到

发表于 2015-7-16 10:43:11 | 显示全部楼层
#ifndef HUDAXIS_H
#define HUDAXIS_H 1

#include <osg/Camera>
#include <osg/MatrixTransform>

using namespace osg;
class HUDAxis:public Camera
{
public:
        HUDAxis();
        HUDAxis(HUDAxis const& copy, CopyOp copyOp = CopyOp::SHALLOW_COPY);
        META_Node(osg, HUDAxis);
        inline  void setMainCamera(Camera* camera){ _mainCamera = camera;}
        virtual void traverse(NodeVisitor& nv);
protected:
        virtual ~HUDAxis();
        observer_ptr<Camera>       _mainCamera;
};
/////////////////////////////////////cpp///////////////////////////////////////////////////

  HUDAxis::HUDAxis()
  {
   //可以在这直接读取axes.osgt;
  //  this->addChild(osgDB::readNodeFile("axes.osgt"));
  }

  HUDAxis::HUDAxis(HUDAxis const& copy, CopyOp copyOp /* = CopyOp::SHALLOW_COPY */):Camera(copy, copyOp),
          _mainCamera(copy._mainCamera)
  {
         
  }

  void HUDAxis::traverse(NodeVisitor& nv)
  {
          static Vec3 trans(0.0, 0.0, -8.0);
          if(_mainCamera.valid() && nv.getVisitorType() == NodeVisitor::CULL_VISITOR)
          {
                  Matrix matrix =  _mainCamera->getViewMatrix();
                 matrix.setTrans(trans);
                 this->setViewMatrix(matrix);
          }//if
          osg::Camera::traverse(nv);
  }

  HUDAxis::~HUDAxis()
  {

  }

////使用这个类代码/////
        ref_ptr<HUDAxis> hudAxes = new HUDAxis;
       ref_ptr(Node)  _axes = osgDB::readNodeFile("axes.osgt");
        hudAxes->addChild(_axes);
        hudAxes->setMainCamera(camera);
        hudAxes->setViewport(0, 0, 200, 200);
        hudAxes->setProjectionMatrix(osg::Matrixd::perspective(30.0f, 1.0, 1.0, 100.0));
        hudAxes->setRenderOrder(Camera:OST_RENDER);
        hudAxes->setClearMask(GL_DEPTH_BUFFER_BIT);
        hudAxes->setAllowEventFocus(false);
        hudAxes->setReferenceFrame(Transform::ABSOLUTE_RF);
        scene->asGroup()->addChild(hudAxes);

/////////////////////////////截图//////////////////////
运行结果.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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