坐标
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
-
- 管理场景树