日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

osg 相机

發布時間:2024/1/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 &center, const osg::Vec3d &up); void setViewMatrixAsLookAt(osg::Vec3d &eye, osg::Vec3d &center, osg::Vec3d &up, double lookDistance=1.0); void setViewMatrixAsLookAt(osg::Vec3f &eye, osg::Vec3f &center, osg::Vec3f &up, float lookDistance=1.0f);

2、投影變換

????????投影變換在顯示流程中是一個非常重要的環節,由于顯示器只能用二維圖像顯示三維物體,因此就要靠投影來降低維數。

? ? ? ? 事實上,投影變換的目的就是定義一個視景體,使視景體多余的部分裁剪掉,最終進入圖像的只是視景體內的有關部分。投影包括透視投影正視投影兩種。

? ? ? ? 透視投影比較好理解,符合正常的視覺現象。離視點越近,物體越大;離視點越遠,物體越小;當遠到極點時,物體小時,變為滅點

在OSG中,有兩種透視投影,即透視視景體對稱透視視景體

  • 透視視景體函數如下 :
/* 創建或者得到一個透視視圖平截體的矩陣,并把它與當前矩陣相乘 第1~4個參數分別是近截剪面的參數信息 第五個參數表示從視點到近截面的距離 第六個參數表示從視點到遠截面的距離 注意:zNer 和 zFar 必須指定為正數 */ void setProjectionMatrixAsFrustum(double left, double right, double bottom, double top, double zNear, double zFar); bool getProjectionMatrixAsFrustum(double &left, double &right, double &bottom, double &top, double &zNear, double &zFar);
  • 對稱透視視景體函數如下:
/* 創建或者得到一個對稱透視視圖平截體的矩陣,并把它與當前矩陣相乘 第1~4個參數分別是近截剪面的參數信息 第五個參數表示從視點到近截面的距離 第六個參數表示從視點到遠截面的距離 注意:zNer 和 zFar 必須指定為正數 */ void setProjectionMatrixAsPerspective(double left, double right, double bottom, double top, double zNear, double zFar); bool getProjectionMatrixAsPerspective(double &left, double &right, double &bottom, double &top, double &zNear, double &zFar);

在OSG中,正射投影也包括兩種,即正射投影特殊的正射投影

  • ?正射投影函數如下:
/* 創建得到一個平行正射投影矩陣,并與當前矩陣相乘 第1~4個參數分別是近裁剪平面的參數信息 第五個參數表示視點距近裁剪面的距離 第六個參數表示視點距遠裁剪面的距離 注意:zNear 和 zFar 必須為正數且不同的值 */ void setProjectionMatrixAsOrtho(double left, double right, double bottom, double top, double zNear, double zFar); bool getProjectionMatrixAsOrtho(double &left, double &right, double &bottom, double &top double &zNear, double zFar);
  • 特殊正射投影函數如下:
/* 創建一個表示把二維投影坐標投影到屏幕的矩陣,并與當前矩陣相乘 第1~4個參數表示一個矩陣的信息 */ void setProjectionMatrixAsOrtho2D(double left, double right, double bottom, double top);

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::Scissorosg::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;}

總結

以上是生活随笔為你收集整理的osg 相机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。