osg--相机

这篇博客详细介绍了OpenGL中的osg库如何管理和控制相机,包括坐标系统、相机的视图矩阵和投影矩阵设置,以及osgViewer::Viewer和osgViewer::CompositeViewer的使用。还涉及了相机的默认全局设置,如立体视觉的实现,以及如何渲染到纹理并保存图片。内容涵盖从基本的相机操作到复杂的视图管理,是理解osg中相机和视图控制的重要参考资料。
摘要由CSDN通过智能技术生成

坐标

Vs = V * modelViewMatrix * projectionMatrix * windowMatrix

  • V * modelViewMatrix * projectionMatrix为左手系,各分量在-1到1

unproject

  • V0 = (Xs, Ys, 0) * invMVPW
  • V1 = (Xs, Ys, 1) * invMVPW

相机

  • osg::Camera 是group节点
    • 功能

      • 管理坐标
        • setViewMatrix

        • setViewMatrixAsLookAt

        • setProjectionMatrix

        • setProjectionMatrixAsFrustum

        • setProjectionMatrixAsOrtho

        • setProjectionMatrixAsOrtho2D

        • setProjectionMatrixAsPerspective

        • setViewport 参数为osg::Viewport

        • get*()

            osg::Matrix viewMatrix = camera->getViewMatrix();
            osg::Vec3 eye, center, up
            camera->getViewMatrixAsLookAt( eye, center, up );
          
      • 封装opengl函数
        • setClearMask 参数为GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT
        • setClearColor 参数为osg::Vec4
        • setClearDepth
        • setClearStencil
        • setClearAccum
        • get*()
      • 显示上下文控制
      • 缓冲区控制
        • color buffer
        • depth buffer
    • 多个相机共享显示上下文

    • 设置相机顺序

        camera1->setRenderOrder( osg::Camera::PRE_RENDER );
        camera2->setRenderOrder( osg::Camera::PRE_RENDER, 5 );
        camera3->setRenderOrder( osg::Camera::POST_RENDER );
      
  • osgViewer::Viewer
    • getCamera() 获取主相机,主相机是osgViewer自动生成并添加为子节点

示例

#include <osg/Camera>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

int main(int argc, char** argv)
{
	osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("lz.osg");
	osg::ref_ptr<osg::Node> hud_model = osgDB::readNodeFile("glider.osg");

	osg::ref_ptr<osg::Camera> camera = new osg::Camera;
	camera->setClearMask(GL_DEPTH_BUFFER_BIT);
	camera->setRenderOrder(osg::Camera::POST_RENDER);
	camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
	camera->setViewMatrixAsLookAt(
		osg::Vec3(0.0f, -5.0f, 5.0f), osg::Vec3(),
		osg::Vec3(0.0f, 1.0f, 1.0f)
	);
	camera->addChild(hud_model.get());

	osg::ref_ptr<osg::Group> root = new osg::Group;
	root->addChild(model.get());
	root->addChild( camera.get() );

	osgViewer::Viewer viewer;
	viewer.setSceneData(root.get());
	return viewer.run();
}

视图类

  • osgViewer::Viewer

    • 管理场景树
      • setSceneData
      • run()
        • 指定主相机的控制器
        • 设置显示上下文
        • 帧循环
      • setRunFrameScheme()参数为osgViewer::Viewer::ON_DEMAND/osgViewer::Viewer::CONTINUOUS
      • setRunMaxFrameRate()
      • done()
        • Esc默认结束键
        • setKeyEventSetsDone指定结束键
      • setDone()
      • getFrameStamp()获取帧信息
    • 管理相机view matrix
      • setCameraManip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值