osg 相机
目錄
osg::Camera類 (相機類)
1、視點變換
2、投影變換
3、視口變換
4、裁剪變換
osg::ClipPlane
osg::Scissor
?5、其他
HUD相機
HUD相機示例
osg::Camera類 (相機類)
osg::Camera 類繼承自 osg::Transform(變換類) 和 osg::CullSettings(裁剪類) 類,用來管理 OSG 中的模型(視圖矩陣);
相機的管理主要是通過各種變換來實現的;
1、視點變換
- 視點變換就是設置視點的方向和位置。
- 默認情況下,視點定位為坐標原點,指向Y正方向。
在 Camera 中的視點變換函數如下:
/* 第一個參數是視點的位置 第二個參數是參考點的位置,該點通常為場景中中心軸上的點 第三個參數是視點向上的方向向量 */ void setViewMatrixAsLookAt(cost osg::Vec3d &eye, const osg::Vec3d ¢er, const osg::Vec3d &up); void setViewMatrixAsLookAt(osg::Vec3d &eye, osg::Vec3d ¢er, osg::Vec3d &up, double lookDistance=1.0); void setViewMatrixAsLookAt(osg::Vec3f &eye, osg::Vec3f ¢er, osg::Vec3f &up, float lookDistance=1.0f);2、投影變換
????????投影變換在顯示流程中是一個非常重要的環節,由于顯示器只能用二維圖像顯示三維物體,因此就要靠投影來降低維數。
? ? ? ? 事實上,投影變換的目的就是定義一個視景體,使視景體多余的部分裁剪掉,最終進入圖像的只是視景體內的有關部分。投影包括透視投影和正視投影兩種。
? ? ? ? 透視投影比較好理解,符合正常的視覺現象。離視點越近,物體越大;離視點越遠,物體越小;當遠到極點時,物體小時,變為滅點;
在OSG中,有兩種透視投影,即透視視景體和對稱透視視景體。
- 透視視景體函數如下 :
- 對稱透視視景體函數如下:
在OSG中,正射投影也包括兩種,即正射投影和特殊的正射投影
- ?正射投影函數如下:
- 特殊正射投影函數如下:
3、視口變換
- 視口變換就是將視景器內投影的物體顯示在二維的視口平面上。
- 它的意義是將經過幾何變換、投影變換和裁剪變換后的物體顯示于屏幕窗口內指定的區域內,這個區域通常為矩形,成為視口。
視口變換函數如下:
/* 創建或者得到一個視口 第1~2個參數表示屏幕左下角的坐標; 第三個參數表示屏幕寬度,第四個參數表示屏幕高度。默認表示整個屏幕大小。 */ void setViewport(osg::Viewer* viewport); void setViewport(int x, int y, int width, int height); const Viewport* getViewport() const; Viewport* getViewport();4、裁剪變換
在OSG中,默認了6個裁剪平面以去除沒有必要顯示的物體。
還可以定義其他的裁剪平面來確定裁減,定義裁剪平面的方法有很多,
如: osg::Scissor 和 osg::ClipPlane
osg::ClipPlane
osg::ClipPlane 類繼承自 osg::StateAttribute 類,封裝了OpenGL 中的glClipPlane() 函數。
設置裁剪平面的有下面幾個函數:
/* 參數都指向一個裁剪平面,裁剪平面可以用 Ax + By + Cz + D = 0 方程表示, 因此,A 、B 、C、D 4個數一次表示裁剪平面方程的4個參數 */ void setClipPlane(const Plane &plane); void setClipPlane(double a, double b, double c, double d); void setClipPlane(const Vec4d &plane);?上面方法只是設置一個裁剪平面的參數,如果要調用,還需要在屬性中開啟該裁剪平面:
root->getOrCreateStateSet()->setAttributeAndModes(cc, osg::StateAttribute::ON);如果要指定多個裁剪平面,需要指定平面的索引,否則前面指定的裁剪平面會被覆蓋。
可以使用以下函數:
// 得到一個裁剪平面的索引或者指定一個平面的索引 void setClipPlaneNum(unsigned int num); unsigned int getClipPlaneNum() const;osg::Scissor
osg::Scissor 類繼承自 osg::StateAttribute 類,封裝可OpenGL 中glScissor() 函數。
該類主要用于設置 一個視口裁剪平面矩陣。函數如下:
// 參數表示一個平面矩陣的信息(左下角坐標、寬度和高度) void setScissor(int x, int y, int width, int height);上面方法只是設置了一個視口裁剪平面矩陣,如果要啟用該裁剪平面,可以用以下方法:
root->getOrCreateStateSet()->setAttributeAndModes(cc, osg::StateAttribute::ON);?5、其他
在osg::Camera 類中除了定義一些基本的變換外,還添加了其他的操作;
清除背景色函數:
void setClearColor(const osg::Vec4 &color); void osg::Vec4& getClearColor() const;清除各種緩存信息函數:
void setColorMask(osg::ColorMask* colorMask); void setColorMask(bool red, bool green, gool blue, bool alpha); const ColorMask* getColorMask() const; ColorMask* getColorMask();例如:
// 向函數中傳入OpenGL 緩存標識,表示清除顏色、深度和模板緩存。 viewer->getCamera()->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);HUD相機
HUD 相機用來在屏幕固定位置顯示一些信息(文字、圖片等)
HUD相機示例
// 創建HUD 相機 osg::Camera* createHUD() {// 新建相機osg::ref_ptr<Camera> camera = new Camera;// 設置矩陣內容camera->setProjectionMatrix(osg::Matrix::ortho2D(0, 1580, 0, 1024));// 設置視圖矩陣內容camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);camera->setViewMatrix(osg::Matrix::identity());// 只清理深度緩沖區camera->setClearMask(GL_DEPTH_BUFFER_BIT);// 設置相機渲染順序camera->setRenderOrder(osg::Camera::POST_RENDER);// 設置相機是否接收圖形設備傳遞的人機交互事件camera->setAllowEventFonce(false);// 創建節點osg::ref_ptr<Geode> geode = new Geode;// 把漢字或者圖片添加到節點即可 (此處以文字為例)osg::ref_ptr<osgText::Text> text = createText();geode->addDrawable(text);// 把節點放入相機camera->addChild(geode);return camera;}// 創建文字 osg::ref_ptr<osgText::Text> createText() { // 創建文字節點osg::ref_ptr<osgText::Text> text = new osgText::Text;// 設置字體text->setFont("fonts/arial.ttf");// 設置文字節點位置text->setPosition(osg::Vec3(150.0f, 800.0f, 0.0f));// 設置文字內容text->setText("你好");return text;}總結
- 上一篇: SQL优化面试专题
- 下一篇: 程序员,为你的将来定位好学习的方向!