网站进入沙盒后客户求购平台
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:39
当前位置: 首页 > news >正文
网站进入沙盒后,客户求购平台,wordpress 编辑器 国外,建设工程人员信息网官网若该文为原创文章#xff0c;未经允许不得转载 本文章博客地址#xff1a;https://blog.csdn.net/qq21497936/article/details/143852695 各位读者#xff0c;知识无穷而人力有穷#xff0c;要么改需求#xff0c;要么找专业人士#xff0c;要么自己研究 长沙红胖子Qt…若该文为原创文章未经允许不得转载 本文章博客地址https://blog.csdn.net/qq21497936/article/details/143852695 各位读者知识无穷而人力有穷要么改需求要么找专业人士要么自己研究 长沙红胖子Qt长沙创微智科博文大全开发技术集合包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等持续更新中… OSG开发专栏点击传送门 上一篇《OSG开发笔记三十一OSG中LOD层次细节模型介绍和使用》 下一篇 持续补充中… 前言 深入理解相机视口摸索相机视口旋转功能背景透明或者不透明。 本篇实现了一个左下角旋转HUD且背景透明的相机视口。 Demo HUD相机的坐标 抬头HUD就是通过投影矩阵来实现具体可参看《OSG开发笔记二十OSG使用HUD显示文字》 Hud要单独创建一个新相机注意关闭光照不受光照影响所以内容以同一亮度显示关闭深度测试渲染顺序设置为POST否则可能会被场景中的其他图形所覆盖。设置参考贴为绝对型setReferenceFrame(osg::Transform:ABSOLUTE_RF)使其不受父节点变换的影响setMatrix(osg::Matrix::identity())投影矩阵通常会设置为屏幕尺寸大小 相机Camera 相机osg::Camera和视口Viewport是两个核心概念对于理解OSG中的三维场景渲染至关重要。 相机在OSG中用于模拟真实世界中的摄影机它负责捕捉和渲染三维场景。相机类osg::Camera继承自osg::Transform和osg::CullSetting类用来管理OSG中的模型——视图矩阵。相机的管理主要是通过各种变换实现的这些变换包括 视点变换设置视点的方向和位置。默认情况下视点定位为坐标原点指向Y正方向。可以通过调整视点的位置和参考点的位置来改变相机的观察方向和角度。投影变换由于显示器只能用二维图像显示三维物体因此要靠投影来降低维数。投影变换的目的是定义一个视景体使视景体外多余的部分被裁减掉最终进入图像的只是视景体内的有关部分。OSG支持两种投影方式透视投影Perspective Projection和正视投影Orthographic Projection。透视投影能够模拟人眼的视觉效果使远处的物体看起来更小而正视投影则保持物体的大小不变不受距离影响。视口变换将视景体内投影的物体显示在二维的视口平面上。即将经过几何变换、投影变换和裁剪变换后的物体显示于屏幕窗口内指定的区域内这个区域通常为矩形称为视口。 视口ViewPort 具体来说视口变换涉及以下几个参数 屏幕左下角的坐标定义了视口在屏幕上的左下角位置。屏幕宽度和高度定义了视口的宽度和高度即相机捕捉的场景在屏幕上显示的区域大小。 在OSG中可以通过调用相机的setViewport方法来设置视口。例如 pCamera-setViewport(new osg::Viewport(0, 0, width, height));这行代码创建了一个新的视口并将其设置为相机的当前视口。其中0和0是屏幕左下角的坐标width和height是视口的宽度和高度。 相机与视口的关系 相机和视口在OSG中紧密相连共同决定了三维场景的渲染效果。相机负责捕捉和渲染场景而视口则定义了相机捕捉的场景在屏幕上的显示位置和大小。通过调整相机的各种变换和设置视口的大小和位置可以实现丰富的三维视觉效果和交互体验。 设置相机观察函数 void setViewMatrixAsLookAt(const osg::Vec3d eye, const osg::Vec3d center, const osg::Vec3d up);eye表示相机的位置。这是一个三维向量指定了相机在世界坐标系中的位置。center表示相机观察的中心点。这也是一个三维向量指定了相机应该对准的物体或场景的中心位置。up表示哪个方向是正方向。这同样是一个三维向量通常用于指定相机的上方方向例如通常设置为 (0,0,1) 表示Y轴正方向为上方。 设置相机位置和方向通过指定 eye、center 和 up 三个参数你可以精确地控制相机的位置和姿态。eye 和 center 之间的向量表示相机的观察方向而 up 向量则用于确定相机的上方方向。 关闭漫游器在使用 setViewMatrixAsLookAt 函数之前通常需要关闭相机的漫游器Camera Manipulator。这是因为漫游器会自动更新相机的观察矩阵从而覆盖你通过 setViewMatrixAsLookAt 设置的参数。可以通过调用 viewer-setCameraManipulator(NULL) 来关闭漫游器。 坐标系OSG 使用右手坐标系其中 X 轴向右Y 轴向上Z 轴向前。因此在设置 eye、center 和 up 参数时需要确保它们符合右手坐标系的规则。 视图矩阵setViewMatrixAsLookAt 函数实际上是通过设置相机的视图矩阵来实现相机位置和姿态的调整。视图矩阵是一个 4x4 的矩阵用于将相机坐标系中的点转换到世界坐标系中。 setViewMatrixAsLookAt 是一个强大的函数它允许你以直观的方式设置相机的位置和姿态。通过合理地使用这个函数你可以创建出各种复杂而逼真的三维场景和视觉效果。 Demo关键源码 创建Hud相机 // 步骤一创建HUD摄像机 // osg::ref_ptrosg::Camera pCamera new osg::Camera;osg::ref_ptrHudRotateCamera pCamera new HudRotateCamera;pCamera-setMasterCamera(_pViewer-getCamera());// 步骤二设置投影矩阵 // pCamera-setProjectionMatrix(osg::Matrix::ortho2D(0, 1280, 0, 800));// 步骤三设置视图矩阵,同时确保不被场景中其他图形位置变换影响, 使用绝对帧引用pCamera-setReferenceFrame(osg::Transform::ABSOLUTE_RF);pCamera-setViewMatrix(osg::Matrix::identity());// 步骤四清除深度缓存pCamera-setClearMask(GL_DEPTH_BUFFER_BIT);// 步骤五设置POST渲染顺序(最后渲染) // pCamera-setRenderOrder(osg::Camera::PRE_RENDER); // 渲染不显示 // pCamera-setRenderOrder(osg::Camera::NESTED_RENDER);pCamera-setRenderOrder(osg::Camera::POST_RENDER);// 步骤六设置为不接收事件,始终得不到焦点pCamera-setAllowEventFocus(false);// osg::ref_ptrosg::Geode pGeode new osg::Geode(); // pGeode new osg::Geode();osg::ref_ptrosg::StateSet pStateSet pGeode-getOrCreateStateSet();// 步骤七关闭光照pStateSet-setMode(GL_LIGHTING, osg::StateAttribute::OFF);// 步骤九关闭深度测试pStateSet-setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);// pGeode-addDrawable(pGeometry.get());pCamera-addChild(pGeode.get());pGroup-addChild(pCamera.get());HudRotateCamera.h #ifndef HUDROTATECAMERA_H #define HUDROTATECAMERA_H#include osg/Camera #include osg/CopyOpclass HudRotateCamera : public osg::Camera { public:HudRotateCamera();HudRotateCamera(const HudRotateCamera copy, const osg::CopyOp copyOp osg::CopyOp::SHALLOW_COPY);META_Node(osg, HudRotateCamera);public:void setMasterCamera(Camera* camera);public:virtual void traverse(osg::NodeVisitor nodeVisitor);protected:virtual ~HudRotateCamera();protected:osg::observer_ptrCamera _pMasterCamera; // 新增了相机主要是用来获取举证的 };#endif // HUDROTATECAMERA_HHudRotateCamera.cpp #include HudRotateCamera.hHudRotateCamera::HudRotateCamera(): Camera() {}HudRotateCamera::HudRotateCamera(const HudRotateCamera copy, const osg::CopyOp copyOp): Camera(copy, copyOp),_pMasterCamera(copy._pMasterCamera) {}HudRotateCamera::~HudRotateCamera() {}void HudRotateCamera::setMasterCamera(osg::Camera *camera) {_pMasterCamera camera; }void HudRotateCamera::traverse(osg::NodeVisitor nodeVisitor) {double fovy, aspectRatio, vNear, vFar;_pMasterCamera-getProjectionMatrixAsPerspective(fovy, aspectRatio, vNear, vFar);// 设置投影矩阵使缩放不起效果, 改为正投影正投影不会随相机的拉近拉远而放大、缩小这样就没有缩放效果// 放大缩小是根据左右上下距离越大就物体越小越小就物体越大this-setProjectionMatrixAsOrtho(-50 * aspectRatio,50 * aspectRatio,-50,50,vNear,vFar);// 让坐标轴模型位于窗体左下角osg::Vec3 vec3(-40, -40, 0);if (_pMasterCamera.valid()){// 改变视图矩阵, 让移动位置固定osg::Matrix matrix _pMasterCamera-getViewMatrix();// 让移动固定, 即始终位于窗体右下角否则鼠标左键按住模型可以拖动或按空格键时模型会动matrix.setTrans(vec3);this-setViewMatrix(matrix);}osg::Camera::traverse(nodeVisitor); }工程模板v1.35.0 入坑 入坑一没有按照预期的方式全屏显示在正中间 问题 想一直显示在中间且能旋转移动中心但是实际效果如下方格100x100间距1.0测试 尝试 将面方格缩小为10x10线放小测试 缩小正交投影 可能跟相机查看位置有关新增相机位置和方向等信息 没什么影响 这里可能理解有问题我们需要区域投影到视口那么一个是投影的区域三维区域的大小一个是投影到桌面2D他的大小这里其实类似于HUD通过HUD的方式添加了几行代码设置投影矩阵 经过测试可以跳过相机调整视口、中心改变后也会移动所以他一种在其位置区域。 然后回到前面发现也可以再次摸索发现如下特点 所以此时纵横都是10所以窗口大小要是符合11101011的比例改为400400测试还是一样 但是调整为800x800就好了 放最大也不会截取少了 所以这个有点搞不明白了总之是解决了且投影矩阵和正交矩阵都可以解决测试投影矩阵和正交举证都收视口大小影响但是影响具体不知就好像800x800是最小一样其他的没测了只测了400x400、600x600不行看比例800x800是最小正好满窗口了。 又怀疑投过去的区域小了将区域放大其位置反倒缩小所以跟理解不一样 一种是理解直接投射过去投射过去区域变大所以变大不是的一种是投射过去区域不变那么区域变大视图区域可见空间范围变大实际是这样但是视口对屏幕的大小未变 综合以上又测试了加大视口也正常所以怀疑有可能是qt和osg结合的时候这个地方设置了一个最小值而可能吧欢迎探讨这里深究暂时也没结果且解决了所以不继续深究了。 解决 修改相机视口大小为最小800x800。 后续补充 后续查看做的这个qtosg兼容类做的时候自己设置的800x800就是这个原因了 入坑二相机视口区域不透明 问题 当作最前面的文本hud是可以透明但是这里进行调整之后无法透明。 尝试 修改了语句可以透明了部分但是没了。 解决 相机是一个投影矩阵没有透明但是文字hud为什么透明呢。 入坑三内置几何体关闭光照后纯白色 问题 关闭光照后几何体白色 原理 光照关闭要设置颜色不想设置颜色就单独给体开放关照。 解决 入坑四文本看不到 问题 文本看不到旋转后发现是太大了。 位置较大。 尝试 测试下是把整个坐标区域的展示范围扩大那么实际看起来就是缩小。 解决 入坑五hud旋转中心不对 问题 Hud旋转中心不对 这时旋转中心还不对可能需要调整旋转中心 原理 开始去修改矩阵发现都不对其实中间点一直是000其就是中心那么我们设置文本的显示点不是从00开始即可。 下面将四边形的角点改为000来标识然后修改文本的中心点 解决 入坑六hud旋转反向了 问题 旋转是反的然后光照也反了变换矩阵有问题 原理 数据几何变换算来算去很费劲直接测试的结论 代码写反了让上下反向了应该是-50~50 解决 还剩下光照问题这个不好咋弄了反正是关闭光照或者是自己手动添加光源用系统的可能有点问题。 这个暂时没解决实际使用就是用一个可以从长度单独给这个相机设置一个光源这里因为需求本身不需要投影不做测试了。 上一篇《OSG开发笔记三十一OSG中LOD层次细节模型介绍和使用》 下一篇 持续补充中… 本文章博客地址https://blog.csdn.net/qq21497936/article/details/143852695
- 上一篇: 网站进入沙盒的表现在线crm软件
- 下一篇: 网站禁ping网站建设费计入管理费用
相关文章
-
网站进入沙盒的表现在线crm软件
网站进入沙盒的表现在线crm软件
- 技术栈
- 2026年03月21日
-
网站进入考核期要多久做洗衣液的企业网站
网站进入考核期要多久做洗衣液的企业网站
- 技术栈
- 2026年03月21日
-
网站进度条特效网络公关公司联系方式
网站进度条特效网络公关公司联系方式
- 技术栈
- 2026年03月21日
-
网站禁ping网站建设费计入管理费用
网站禁ping网站建设费计入管理费用
- 技术栈
- 2026年03月21日
-
网站经营跟备案不符人才网站app建设建议
网站经营跟备案不符人才网站app建设建议
- 技术栈
- 2026年03月21日
-
网站经营网络备案信息管理系统网站建设基础考试
网站经营网络备案信息管理系统网站建设基础考试
- 技术栈
- 2026年03月21日

