OSG绘制视锥体

2023-12-31 03:36
文章标签 绘制 osg 锥体

本文主要是介绍OSG绘制视锥体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近要来实现一个相机位姿态可视化的需求,不想使用pangolin,不好集成,想用osg来做可视化。以下是demo效果。

代码实现:

// Cone_of_vision.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <osgViewer/Viewer>
#include <osg/Camera>
#include <osg/Geode>
#include <osg/Geometry>// 在创建相机视锥体时计算视锥体顶点和设置边线
osg::ref_ptr<osg::Geode> createCameraFrustum(osg::Camera* camera) {osg::ref_ptr<osg::Geode> geode = new osg::Geode();osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();// 获取相机的投影矩阵和视图矩阵osg::Matrixd projectionMatrix = camera->getProjectionMatrix();osg::Matrixd viewMatrix = camera->getViewMatrix();// 计算视锥体顶点坐标osg::Vec3Array* vertices = new osg::Vec3Array(9);double nearPlane, farPlane;// 获取近和远裁剪平面的值double fovY = 1;double aspectRatio = 0.5;projectionMatrix.getPerspective(fovY, aspectRatio, nearPlane, farPlane);farPlane = 1.9;double tanFovY = tan(fovY * 0.5);double tanFovX = tanFovY * aspectRatio;// 近裁剪平面的四个顶点(*vertices)[0] = osg::Vec3(0.0, 0.0, 0.0);(*vertices)[1] = osg::Vec3(tanFovX * nearPlane, tanFovY * nearPlane, -nearPlane);(*vertices)[2] = osg::Vec3(-tanFovX * nearPlane, tanFovY * nearPlane, -nearPlane);(*vertices)[3] = osg::Vec3(-tanFovX * nearPlane, -tanFovY * nearPlane, -nearPlane);(*vertices)[4] = osg::Vec3(tanFovX * nearPlane, -tanFovY * nearPlane, -nearPlane);// 远裁剪平面的四个顶点(*vertices)[5] = osg::Vec3(tanFovX * farPlane, tanFovY * farPlane, -farPlane);(*vertices)[6] = osg::Vec3(-tanFovX * farPlane, tanFovY * farPlane, -farPlane);(*vertices)[7] = osg::Vec3(-tanFovX * farPlane, -tanFovY * farPlane, -farPlane);(*vertices)[8] = osg::Vec3(tanFovX * farPlane, -tanFovY * farPlane, -farPlane);// 设置视锥体的边线osg::ref_ptr<osg::DrawElementsUInt> edges = new osg::DrawElementsUInt(osg::PrimitiveSet::LINES, 24);// 给edges数组添加顶点索引来定义边线edges->push_back(0); edges->push_back(1);edges->push_back(0); edges->push_back(2);edges->push_back(0);edges->push_back(3);edges->push_back(0);edges->push_back(4);edges->push_back(1);edges->push_back(2);edges->push_back(3);edges->push_back(4);edges->push_back(1);edges->push_back(4);edges->push_back(2);edges->push_back(3);edges->push_back(0 );edges->push_back(1 + 4);edges->push_back(0 );edges->push_back(2 + 4);edges->push_back(0 );edges->push_back(3 + 4);edges->push_back(0 );edges->push_back(4 + 4);edges->push_back(1 + 4);edges->push_back(2 + 4);edges->push_back(3 + 4);edges->push_back(4 + 4);edges->push_back(1 + 4);edges->push_back(4 + 4);edges->push_back(2 + 4);edges->push_back(3 + 4);/*edges->push_back(0);edges->push_back(7);edges->push_back(0);edges->push_back(8);*/// 其他边线的索引添加类似的操作...// 设置几何体属性geometry->setVertexArray(vertices);geometry->addPrimitiveSet(edges);geode->addDrawable(geometry);return geode;
}osg::ref_ptr<osg::Geode> createPyramid() {osg::ref_ptr<osg::Geode> geode = new osg::Geode();osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();// 顶点数组osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;vertices->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));  // 顶点vertices->push_back(osg::Vec3(1.0f, 0.0f, -1.0f)); // 底面顶点1vertices->push_back(osg::Vec3(-1.0f, 0.0f, -1.0f)); // 底面顶点2vertices->push_back(osg::Vec3(0.0f, 1.0f, 0.0f)); // 底面顶点3vertices->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); // 底面顶点4// 设置几何体的顶点geometry->setVertexArray(vertices.get());// 底面索引数组osg::ref_ptr<osg::DrawElementsUInt> baseIndices = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES);baseIndices->push_back(1);baseIndices->push_back(2);baseIndices->push_back(3);baseIndices->push_back(2);baseIndices->push_back(1);baseIndices->push_back(4);baseIndices->push_back(3);baseIndices->push_back(2);baseIndices->push_back(4);baseIndices->push_back(1);baseIndices->push_back(3);baseIndices->push_back(4);// 侧面索引数组osg::ref_ptr<osg::DrawElementsUInt> sideIndices = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES);sideIndices->push_back(0);sideIndices->push_back(1);sideIndices->push_back(2);sideIndices->push_back(0);sideIndices->push_back(2);sideIndices->push_back(3);sideIndices->push_back(0);sideIndices->push_back(3);sideIndices->push_back(4);sideIndices->push_back(0);sideIndices->push_back(4);sideIndices->push_back(1);// 添加底面和侧面索引geometry->addPrimitiveSet(baseIndices.get());geometry->addPrimitiveSet(sideIndices.get());geode->addDrawable(geometry.get());return geode;
}osg::ref_ptr <osg::Geode > cteateQuad()
{//创建一个叶节点对象osg::ref_ptr <osg::Geode > geode = new osg::Geode();//创建一个几何体对象osg::ref_ptr <osg::Geometry >geom = new osg::Geometry();//添加顶点数据 注意顶点的添加顺序是逆时针osg::ref_ptr <osg::Vec3Array >v = new osg::Vec3Array();//添加数据v->push_back(osg::Vec3(0, 0, 0));v->push_back(osg::Vec3(1, 0, 0));v->push_back(osg::Vec3(1, 0, 1));v->push_back(osg::Vec3(0, 0, 1));//设置顶点数据geom->setVertexArray(v.get());//创建纹理订点数据osg::ref_ptr <osg::Vec2Array >vt = new osg::Vec2Array();//添加纹理坐标vt->push_back(osg::Vec2(0, 0));vt->push_back(osg::Vec2(1, 0));vt->push_back(osg::Vec2(1, 1));vt->push_back(osg::Vec2(0, 1));//设置纹理坐标geom->setTexCoordArray(0, vt.get());//创建颜色数组osg::ref_ptr <osg::Vec4Array >vc = new osg::Vec4Array();//添加数据vc->push_back(osg::Vec4(1, 0, 0, 1));vc->push_back(osg::Vec4(0, 1, 0, 1));vc->push_back(osg::Vec4(0, 0, 1, 1));vc->push_back(osg::Vec4(1, 1, 0, 1));//设置颜色数组geom->setColorArray(vc.get());//设置颜色的绑定方式为单个顶点geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);//创建法线数组osg::ref_ptr <osg::Vec3Array >nc = new osg::Vec3Array();//添加法线nc->push_back(osg::Vec3(0, -1, 0));//设置法线geom->setNormalArray(nc.get());//设置法绑定为全部顶点geom->setNormalBinding(osg::Geometry::BIND_OVERALL);//添加图元geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));//添加到叶子节点geode->addDrawable(geom.get());return geode.get();
}int main() {// 创建场景图和视图器osg::ref_ptr<osg::Group> root = new osg::Group();osgViewer::Viewer viewer;// 创建四棱锥体几何体osg::ref_ptr<osg::Geode> pyramid = createCameraFrustum(viewer.getCamera());// 将四棱锥体添加到场景图中root->addChild(pyramid);// 设置场景图到视图器并运行viewer.setSceneData(root);return viewer.run();
}

 

 

这篇关于OSG绘制视锥体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/554825

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

使用matplotlib绘制散点图、柱状图和饼状图-学习篇

一、散点图 Python代码如下: num_points = 100x = np.random.rand(num_points) #x点位随机y = np.random.rand(num_points) #y点位随机colors = np.random.rand(num_points) #颜色随机sizes = 1000 * np.random.rand(num_points) # 大

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑