您的位置:首页 > 其它

osg中实现如果AutoCAD中左下角的坐标轴

2015-11-03 16:32 1041 查看
在场景左下角显示一个表示当前场景坐标轴向,它只是对相机旋转有反应,对场景缩放和移动不起效果,采取方法:将一个坐标轴模型节点放在一个Projection下或放在Matrixtransform下设置为绝对坐标模式,让后再回调剔除移动变换。
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)
{
double fovy, aspectRatio, vNear, vFar;
_mainCamera->getProjectionMatrixAsPerspective(fovy, aspectRatio, vNear, vFar);
this->setprojectionMatrixAsOrtho(-10.0*aspectRatio, 10.0*aspectRatio, -10.0, 10.0, 2.0, -2.0);

Vec3 trans(8.5*aspectRatio, -8.5, -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->setRenderOrder(Camera:OST_RENDER);
hudAxes->setClearMask(GL_DEPTH_BUFFER_BIT);
hudAxes->setAllowEventFocus(false);
hudAxes->setReferenceFrame(Transform::ABSOLUTE_RF);
scene->asGroup()->addChild(hudAxes);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: