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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OSG 自定义场景漫游示例

發布時間:2023/12/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OSG 自定义场景漫游示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

一下代碼可以簡單實現osg中視角的簡單自由漫游.并且可以進行簡單的碰撞檢測

?

?

mian.cpp

1 #include <osgViewer/Viewer> 2 3 #include <osg/Node> 4 #include <osg/Geode> 5 #include <osg/Group> 6 7 #include <osgDB/ReadFile> 8 #include <osgDB/WriteFile> 9 10 #include <osgUtil/Optimizer> 11 12 #include "ManipulatorTravel.h" 13 14 int main() 15 { 16 //創建Viewer對象,場景瀏覽器 17 osgViewer::Viewer* viewer = new osgViewer::Viewer(); 18 19 //把漫游器加入到場景中 20 TravelManipulator::TravelToScene(viewer); 21 22 osg::Group* root = new osg::Group(); 23 24 //讀取地形模型 25 osg::Node* node = new osg::Node(); 26 node = osgDB::readNodeFile("lz.osg"); 27 28 //添加到場景 29 root->addChild(node); 30 31 //優化場景數據 32 osgUtil::Optimizer optimizer ; 33 optimizer.optimize(root) ; 34 35 viewer->setSceneData(root); 36 37 viewer->realize(); 38 39 viewer->run(); 40 41 return 0 ; 42 }

?

?

ManipulatorTravel.h

#pragma once#include <osgViewer/Viewer>#include <osg/LineSegment> #include <osg/Point> #include <osg/Geometry> #include <osg/Node> #include <osg/Geode> #include <osg/Group>//#include <osgGA/MatrixManipulator> #include <osgUtil/IntersectVisitor>#include <vector>class TravelManipulator : public osgGA::CameraManipulator { public://構造函數 TravelManipulator ();//析構函數 ~TravelManipulator(void);// 把漫游加入到場景之中 static TravelManipulator * TravelToScene(osg::ref_ptr <osgViewer::Viewer> viewer);private: osg::ref_ptr <osgViewer::Viewer> m_pHostViewer;//移動速度 float m_fMoveSpeed; // osg::Vec3 m_vPosition; // osg::Vec3 m_vRotation;public://鼠標左鍵是否按下 bool m_bLeftButtonDown ;//鼠標X,Y float m_fpushY;float m_fpushX;//設置矩陣 virtual void setByMatrix(const osg::Matrixd& matrix); //設置逆矩陣 virtual void setByInverseMatrix(const osg::Matrixd& matrix); //得到矩陣 virtual osg::Matrixd getMatrix(void) const; //得到逆矩陣 virtual osg::Matrixd getInverseMatrix(void)const ;//事件處理函數 virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us);// 屏目角度 float m_fAngle;// 位置變換函數 void ChangePosition(osg::Vec3& delta);//碰撞檢測是否開啟 bool m_bPeng;//設置速度 float getSpeed() ;void setSpeed(float &) ;//設置起始位置 void SetPosition(osg::Vec3 &position) ;osg::Vec3 GetPosition() ;} ;

?

?

ManipulatorTravel.cpp

?

#include "ManipulatorTravel.h"//構造函數 TravelManipulator::TravelManipulator(): m_fMoveSpeed(1.0f) , m_bLeftButtonDown(false) , m_fpushX(0) , m_fAngle(2.5) , m_bPeng(true) , m_fpushY(0) { m_vPosition = osg::Vec3(-22.0f, -274.0f, 100.0f);m_vRotation = osg::Vec3(osg::PI_2, 0.0f, 0.0f);} //析構函數 TravelManipulator::~TravelManipulator() { // } // 把漫游加入到場景之中 TravelManipulator * TravelManipulator::TravelToScene(osg::ref_ptr <osgViewer::Viewer> viewer) { TravelManipulator* camera = new TravelManipulator;viewer->setCameraManipulator(camera) ;camera->m_pHostViewer =viewer ;return camera; }// 設置矩陣 void TravelManipulator::setByMatrix(const osg::Matrixd& matrix) { // } //設置逆矩陣 void TravelManipulator::setByInverseMatrix(const osg::Matrixd& matrix) { // } //得到矩陣 osg::Matrixd TravelManipulator::getMatrix(void) const { osg::Matrixd mat;mat.makeRotate(m_vRotation._v[0], osg::Vec3(1.0f, 0.0f, 0.0f),m_vRotation._v[1], osg::Vec3(0.0f, 1.0f, 0.0f),m_vRotation._v[2], osg::Vec3(0.0f, 0.0f, 1.0f));return mat * osg::Matrixd::translate(m_vPosition); } //得到逆矩陣 osg::Matrixd TravelManipulator::getInverseMatrix(void) const { osg::Matrixd mat;mat.makeRotate(m_vRotation._v[0], osg::Vec3(1.0f, 0.0f, 0.0f),m_vRotation._v[1], osg::Vec3(0.0f, 1.0f, 0.0f),m_vRotation._v[2], osg::Vec3(0.0f, 0.0f, 1.0f));return osg::Matrixd::inverse(mat * osg::Matrixd::translate(m_vPosition)); } //事件處理函數 bool TravelManipulator::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) { //得到鼠標的位置 float mouseX = ea.getX(); float mouseY = ea.getY();switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::KEYDOWN): { //空格鍵 if (ea.getKey() == 0x20) { us.requestRedraw();us.requestContinuousUpdate(false);return true; } //上移動 if (ea.getKey() == 0xFF50) { ChangePosition(osg::Vec3 (0, 0, m_fMoveSpeed)) ;return true; } //下移動 if (ea.getKey() == 0xFF57) { ChangePosition(osg::Vec3 (0, 0, -m_fMoveSpeed)) ;return true; } //增加速度 if (ea.getKey() == 0x2B) { m_fMoveSpeed += 1.0f;return true; } //減少速度 if (ea.getKey() == 0x2D) { m_fMoveSpeed -= 1.0f;if (m_fMoveSpeed < 1.0f) { m_fMoveSpeed = 1.0f; } return true; } //前進 if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up {ChangePosition(osg::Vec3 (0, m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0)) ;ChangePosition(osg::Vec3 (m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;return true; } //后退 if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down { ChangePosition(osg::Vec3 (0, -m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0)) ;ChangePosition(osg::Vec3(-m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;return true; } //向左 if (ea.getKey () == 0x41||ea.getKey () == 0x61) { ChangePosition(osg::Vec3 (0, m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0)) ;ChangePosition(osg::Vec3 (-m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;return true; } //向右 if (ea.getKey () == 0x44||ea.getKey () == 0x64) { ChangePosition(osg::Vec3 (0,-m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0)) ;ChangePosition(osg::Vec3 (m_fMoveSpeed * sinf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;return true; } //Right if (ea.getKey() == 0xFF53) { m_vRotation._v[2] -= osg::DegreesToRadians(m_fAngle); } //Left if (ea.getKey()== 0xFF51) { m_vRotation._v[2] += osg::DegreesToRadians(m_fAngle); } //改變屏角 if (ea.getKey() == 0x46 || ea.getKey() == 0x66)//F { m_fAngle -= 0.2 ;return true ; }if (ea.getKey() == 0x47 || ea.getKey() == 0x67)//G { m_fAngle += 0.2 ;return true ; }return false; } //鼠標按下 case (osgGA::GUIEventAdapter ::PUSH ):if ( ea.getButton () == 1) { m_fpushX = mouseX ; m_fpushY = mouseY ;m_bLeftButtonDown = true ; }return false ;//拖動 case (osgGA::GUIEventAdapter ::DRAG ):if ( m_bLeftButtonDown){ m_vRotation._v[2] -= osg::DegreesToRadians(m_fAngle * (mouseX-m_fpushX));m_vRotation._v[0] += osg::DegreesToRadians(1.1*(mouseY-m_fpushY)) ;if (m_vRotation._v [0] >= 3.14) { m_vRotation._v [0] = 3.14 ; }if (m_vRotation._v [0] <= 0) { m_vRotation._v [0] = 0 ; } }return false ; //鼠標釋放 case (osgGA::GUIEventAdapter ::RELEASE ):if ( ea.getButton () == 1) { m_bLeftButtonDown = false ; }return false ;default: return false; } }// 位置變換函數 void TravelManipulator::ChangePosition(osg::Vec3& delta) { //碰撞檢測 if (m_bPeng) { //得到新的位置 osg::Vec3 newPos1 = m_vPosition + delta;osgUtil::IntersectVisitor ivXY; //根據新的位置得到兩條線段檢測 osg::ref_ptr<osg::LineSegment> lineXY = new osg::LineSegment(newPos1, m_vPosition);osg::ref_ptr<osg::LineSegment> lineZ = new osg::LineSegment(newPos1+osg::Vec3(0.0f,0.0f,10.0f), newPos1-osg::Vec3(0.0f,0.0f,-10.0f)) ;ivXY.addLineSegment(lineZ.get()) ;ivXY.addLineSegment(lineXY.get()) ; //結構交集檢測 m_pHostViewer->getSceneData()->accept(ivXY) ; //如果沒有碰撞檢測 if(!ivXY.hits()) { m_vPosition += delta; } } else { m_vPosition += delta; }}//設置速度 void TravelManipulator::setSpeed (float &sp) { m_fMoveSpeed = sp ; }//得到當前速度 float TravelManipulator::getSpeed() { return m_fMoveSpeed ; }//設置起始的位置 void TravelManipulator::SetPosition (osg::Vec3 &position) { m_vPosition = position ; }//得到當前的所在位置 osg::Vec3 TravelManipulator::GetPosition () { return m_vPosition ; }

?

轉載于:https://www.cnblogs.com/HUNTUN/p/5601758.html

總結

以上是生活随笔為你收集整理的OSG 自定义场景漫游示例的全部內容,希望文章能夠幫你解決所遇到的問題。

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