OSG绘制视锥体(升级版)

OSG绘制视锥体,这一篇增加设置相机参数接口,支持通过eye、center、up设置相机参数。

代码如下:

#include "stdafx.h"
#include <osgViewer/Viewer>
#include <osg/ShapeDrawable>
#include <osg/Geode>
#include <osg/MatrixTransform>
#include <osg/Camera>
#include <osgUtil/PolytopeIntersector>
#include <osgUtil/LineSegmentIntersector>// 在创建相机视锥体时计算视锥体顶点和设置边线
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);//获取对称透视投影的截锥体设置//fovY=29//aspectRatio=1.24//nearPlane=0.9//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;
}int main(int argc, char** argv) {osgViewer::Viewer viewer;// 创建相机并设置视图矩阵和投影矩阵osg::ref_ptr<osg::Camera> camera = viewer.getCamera();camera->setProjectionMatrixAsPerspective(45.0f, 1.0f, 0.1f, 100.0f); // 设置透视投影矩阵osg::Vec3 eye(0.0f, 0.0f, 5.0f);osg::Vec3 center(0.0f, 0.0f, 0.0f);osg::Vec3 up(0.0f, 1.0f, 0.0f);camera->setViewMatrixAsLookAt(eye, center, up); // 设置视图矩阵// 创建场景根节点osg::ref_ptr<osg::Group> root = new osg::Group;osg::ref_ptr<osg::Geode> frustumGeometry = createCameraFrustum(camera);root->addChild(frustumGeometry); // 将相机视锥体添加到根节点viewer.setSceneData(root);viewer.setUpViewInWindow(100, 100, 800, 600);return viewer.run();
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产品经理学习-怎么写PRD文档

目录 瀑布流方法论介绍 产品需求文档&#xff08;PRD&#xff09;介绍 产品需求文档的基本要素 撰写产品需求文档 优先产品需求文档的特点 其他相关文档 瀑布流方法论介绍 瀑布流模型是一种项目的开发和管理的方法论&#xff0c;是敏捷的开发管理方式相对应的另一种方法…

JVM工作原理与实战(二):字节码编辑器jclasslib

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、字节码编辑器jclasslib介绍和安装 1.介绍 2.安装 3.IntelliJ IDEA 插件安装 二、字节码编辑器jclasslib的使用 1.使用jclasslib bytecode viewer打开字节码文件 2.使用Intell…

Python+OpenGL绘制3D模型(九)完善插件功能: 矩阵,材质,法线

系列文章 一、逆向工程 Sketchup 逆向工程&#xff08;一&#xff09;破解.skp文件数据结构 Sketchup 逆向工程&#xff08;二&#xff09;分析三维模型数据结构 Sketchup 逆向工程&#xff08;三&#xff09;软件逆向工程从何处入手 Sketchup 逆向工程&#xff08;四&#xf…

7.java——Obiect内部类 equals方法和toString方法

1.所有的java类都必须继承于object类 object中没有声明任何属性 object类提供一个空参的构造器 object类中声明的方法 面试题&#xff1a;final &#xff0c;finally&#xff0c;finalize区别 在Java中&#xff0c;final、finally和finalize是三个不同的概念。 1.final是一个…

自动驾驶学习笔记(二十三)——车辆控制模型

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 运动学模型 动力学模型 总结…

微服务(4)

目录 16.网关与过滤器有什么区别&#xff1f; 17.常用的网关框架有哪些&#xff1f; 18.Zuul与Nginx有什么区别&#xff1f; 19.既然Nginx可以实现网关&#xff0c;为什么还需要使用Zuul框架&#xff1f; 20.ZuulFilter常用有哪些方法&#xff1f; 16.网关与过滤器有什么区…

MyBatis-config.xml配置文件

1、基本介绍&#xff1a; mybatis的核心配置文件(mybatis-config.xml)&#xff0c;比如配置jdbc连接信息&#xff0c;注册mapper等等&#xff0c;我们需要对这个配置文件有详细的了解。 官网地址有详细介绍 mybatis – MyBatis 3 | 配置 2、properties属性 在通常的情况下&am…

Java 运算符

&&运算比||运算的优先级高 C与Java

GPT-5:未来的大潮,即将到来?

GPT-5&#xff1a;未来的大潮&#xff0c;即将到来&#xff1f; 随着人工智能领域的迅猛发展&#xff0c;OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型已经成为了业界的焦点。自从GPT-3在2020年震撼发布以来&#xff0c;它凭借强大的自然语…

微信小程序 手机号授权登录 偶尔后端解密失败

微信小程序wx.login获取code要在手机号授权前触发 <button:id"code":open-type"hasGetPrivacySetting ? getPhoneNumber|agreePrivacyAuthorization : getPhoneNumber"getphonenumber"onGetPhoneNumber"class"btn"click"cli…

【Unity入门】热更新框架之xLua

目录 一、xLua概述1.1xLua简介1.2xLua安装 二、Lua文件加载2.1执行字符串2.2加载Lua文件2.3自定义loader 三、xLua文件配置3.1打标签3.2静态列表3.3动态列表 四、Lua与C#交互4.1 C#访问Lua4.1.1 获取一个全局基本数据类型4.1.2 访问一个全局的table4.1.3 访问一个全局的functio…

python:PyCharm更改.PyCharm配置文件夹存储位置

关联账号文章&#xff1a;另外的账号 在启动 PyCharm 后选择 Help -> Edit Custom Properties 的选项&#xff0c;弹出&#xff1a; 选择 Create &#xff0c;之后在文件中添加配置文件新的存储位置即可&#xff0c;例如&#xff1a; idea.config.pathD:/Program Files/.Py…

STM32 ESP8266 物联网智能温室大棚 源码PCB原理图 设计文档

资料下载: https://download.csdn.net/download/vvoennvv/88680924 一、概述 本系统以STM32F103C8T6单片机为主控芯片&#xff0c;采用相关传感器构建系统硬件电路。其中使用DHT11温湿度传感器对温度和湿度的采集&#xff0c;MQ-7一氧化碳传感器检测CO浓度&#xff0c;GP2Y101…

Hive集群出现报错信息解决办法

一、报错信息&#xff1a;hive> show databases;FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient 解决办法&#xff1a;1.删除mysql中的元数据库&#xff08;metastore&#xff0…

车载电子电器架构 —— 电子电气系统开发角色定义

车载电子电器架构 —— 电子电气系统开发角色定义 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 注:本文12000字,深度思考者进!!! 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的…

docker_ROS的usb_cam使用与标定

目录 准备 准备标定板 新建容器 新建usb_cam话题的ROS功能包 编写代码 编译 运行功能包 标定 安装camera_calibration标定功能包 启动发布usb_cam话题的功能包 启动camera_calibration标定功能包 准备 usb相机 标定板 一个带有ROS的docker镜像。 准备标定板 图…

Spark编程实验四:Spark Streaming编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、利用Spark Streaming对三种类型的基本数据源的数据进行处理 2、利用Spark Streaming对Kafka高级数据源的数据进行处理 3、完成DStream的两种有状态转换操作 4、把DStream的数据输出保存到文本文件或MySQL数据库中 四…

什么是检索增强生成?

检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;是指对大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;输出进行优化&#xff0c;使其能够在生成响应之前引用训练数据来源之外的权威知识库。LLM 用海量数据进行…

win11出现安全中心空白和IT管理员已限制对某些区域的访问(不一样的解决方式),真实的个人经历,并且解决经过

1、个人的产生问题的经历 2023年12月22日&#xff0c;由于我买了一块电脑的固态硬盘1T&#xff0c;想要扩容&#xff0c;原来电脑自带512G(由于个人是一个程序员&#xff0c;导致512G实在太古鸡肋)装好以后&#xff0c;想要重装一下系统&#xff0c;来个大清理。结果不出意料&…