OSG开发-使用VisualStudio2019创建CMake项目方式开发HelloOSG

news2024/12/23 0:17:43

本文保证你使用VS2019,可以把这个OSG程序开发出来,看到那个蓝色的带有纹理的地球。

大概步骤如下:

  • 下载已经编译好的OSG的库和头文件
  • 新建一个CMake项目
  • 编辑make.txt
  • 编写main.cpp
  • 运行。

 下载已经编译好的OSG的库和头文件

由于我们需要用OSG的库来做开发,当然就需要下载人家的库了。去

OpenSceneGraph | Objexx Engineering,下载,我下载的是和VS2019配套的那个,下载后解压到E盘,OSG目录下,形成如下目录就ok。

 然后可以把这个bin目录放入系统环境变量path中,如图:

 

path的值中添加;E:\OSG\OpenSceneGraph-3.6.5-VC2019-64-Debug\bin,别忘记这个分号

这样这个目录下面的N多DLL文件就可以被找到了。有这么多DLL文件呢。

 比较重要的就是这个osgd.dll,如果不设置环境变量,就会提示找不到这个osgd.dll的错误。

新建一个CMake项目

打开VS2019,新建项目,选择CMake项目,起个名字,本文名字是:CMakeProject_FirstOSG

 

创建这个项目成功后,项目目录如下:

 注意观察会发现有两个CMakeLists.txt文件,一个是总体的,一个是项目CMakeProject_FirstOSG

项目目录下面的。我们主要是修改这个项目CMakeProject_FirstOSG项目目录下面的CMakeLists.txt文件,总体的我们不需要管。不过可以把总体的makefile内容放在这里看一下:

# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)

project ("CMakeProject_FirstOSG")

# 包含子项目。
add_subdirectory ("CMakeProject_FirstOSG")

这个就是做一些全局的配置,添加个子目录,不去修改它。

编辑make.txt

引入osg库,首先要告诉编译器库头文件的位置。在CMake中使用include_directories()指令实现。

include_directories()指令告诉编译器搜索头文件的路径。

我们还要告诉编译器库文件的位置。在CMake中使用link_directories()指令实现,link_directories()指令告诉链接器器搜索库文件的路径。

接下来我们还要告诉编译器,具体链接哪个库文件。在CMake中使用target_link_libraries()指令实现。target_link_libraries()指令指定哪些库需要链接到目标上。

总之最后这个makefile的内容如下:

# CMakeList.txt: CMakeProject_FirstOSG 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)
#设定环境变量:OSG_DIR
set(OSG_DIR "E:/osg/OpenSceneGraph-3.6.5-VC2019-64-Debug")
#包含文件的目录是:OSG_DIR 下面的include目录
include_directories(${OSG_DIR}/include)
#需要链接的库文件所在目录为:OSG_DIR下面的lib
link_directories(${OSG_DIR}/lib)


# 将源代码添加到此项目的可执行文件。(下面的语句是VS自动生成的:CMakeProject_FirstOSG是exe文件的名字,后面是所有源文件的名字)
add_executable (CMakeProject_FirstOSG "CMakeProject_FirstOSG.cpp" "CMakeProject_FirstOSG.h")

# TODO: 如有需要,请添加测试并安装目标
target_link_libraries(CMakeProject_FirstOSG osgd	osgViewerd osgDBd)

注意:以上makefile里面的内容是有顺序的,顺序不对,会提示出错,也会提示让你选择启动项。出现这个说明add_executable()前面有一些内容设置的不对,该把 add_executable()放在靠前的位置。总之,就用我这个例子文件,不要修改语句的顺序。

修改main()函数

修改这个主函数,添加视图,添加地球,给地球设置纹理。纹理文件可以去这里下载:

链接: https://pan.baidu.com/s/1vXi5bqBiEjZfmtbnrJH8Mw 提取码: 1234 

mai()函数内容如下:

// CMakeProject_FirstOSG.cpp: 定义应用程序的入口点。
//

#include <osgViewer/Viewer>//添加Viewer使用

#include <osg/Geode>//添加球使用
#include <osg/ShapeDrawable>//添加球使用

#include <osg/Texture2D>//纹理程序段使用
#include <osgDB/ReadFile>//纹理程序段使用

#include "CMakeProject_FirstOSG.h"

using namespace std;

int main()
{
	cout << "Hello CMake.———〉〉〉〉OSG" << endl;
	//*****我是华丽的程序分割线******开始******我添加了一个viewer//
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
	viewer->setUpViewInWindow(50, 50, 800, 600);
	//*****我是华丽的程序分割线******结束******我添加了一个viewer//

	//*****我是华丽的程序分割线******开始******我添加了一个球//
	osg::ref_ptr<osg::Geode> geode = new osg::Geode;
	geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(), 1.0f)));
	viewer->setSceneData(geode);
	//*****我是华丽的程序分割线******结束******我添加了一个球//
	//*****我是华丽的程序分割线******开始******我为这个球添加了纹理//
	osg::ref_ptr<osg::Texture> texture = new osg::Texture2D(osgDB::readRefImageFile("E:/world.png"));
	auto stateSet = geode->getOrCreateStateSet();
	stateSet->setTextureAttributeAndModes(0, texture);
	//*****我是华丽的程序分割线******结束******我为这个球添加了纹理//

	return viewer->run();
	//return 0;
}

各个阶段的图片如下:

添加了纹理之后,这个球看起来好多了。

 

 有了这个,以后就可以研究点高深的了。

本文参考了

Zhihui Tangicon-default.png?t=M85Bhttps://blog.csdn.net/forcsdn_tang 非常感谢!

 

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

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

相关文章

blender 常用修改器

文章目录前置.阵列.倒角.布尔.精简.拆边.镜像.螺旋.实体化表面细分.三角化.体积到网格.焊接修改器.蒙皮.线框.铸型.曲线修改器.置换修改器.晶格修改器.缩裹修改器.简易修改.表面形变修改 .多级精度修改器.前置. 注意&#xff0c;修改器未应用前&#xff0c;只能操作原物体 阵…

自动驾驶:2022 apollo day 观后感(三)

自动驾驶&#xff1a;2022 apollo day 观后感&#xff08;三&#xff09;TOPIC THREE&#xff1a; 文心大模型在自动驾驶感知中的落地应用&#xff08;王井东&#xff09;多传感器融合autolabeling的发展&#xff1a;大模型数据闭环大模型&#xff0c;已经成为自动驾驶能力提升…

差动驱动机器人轨迹-CoCube

轨迹博客&#xff1a; 玫瑰线轨迹如何规划&#xff1f;&#xff08;desmosROS2turtlesim……&#xff09; ROS1云课→23turtlesim绘制小结&#xff08;数学和编程&#xff09; 如上所涉及的机器人假定模型都是差动驱动机器人。 许多移动机器人使用一种称为差动驱动的驱动机构…

vue项目图片裁剪上传——vue-cropper的使用,裁剪后上传头像

vue项目图片裁剪上传——vue-cropper的使用&#xff0c;裁剪后上传头像 npm地址&#xff1a;https://www.npmjs.com/package/vue-cropper github地址&#xff1a;https://github.com/xyxiao001/vue-cropper 在线demo&#xff1a;http://github.xyxiao.cn/vue-cropper/exampl…

学习分享:如何进行全局变量的学习

​对于很多朋友&#xff0c;尤其是刚接触全局变量的朋友而言&#xff0c;全局变量的学习对他们来说不是一件容易的事情。关于这方面的学习&#xff0c;很多朋友不太理解它的用法及分析方法&#xff0c;所以会比较乱&#xff0c;难以掌握。 什么是axure全局变量&#xff1f;全局…

【STM32】详解PWM的概念和原理

PWM的概念和原理一、PWM是什么&#xff1f;二、如何实现&#xff1f;三、STM32中的PWM四、使用库函数配置PWM将LED0设置为呼吸灯一、PWM是什么&#xff1f; PWM&#xff08;Pulse width modulation&#xff09;脉冲宽度调制。PWM是通过编程控制输出方波的频率和占空比&#xf…

oracle自启动的p***并行进程过多导致的process进程超限问题

某项目现场反馈无任何业务连接&#xff0c;查询v$process仍有500多个进程&#xff1b; 查询会话连接&#xff0c;也只有十几个会话&#xff1b; select b.MACHINE, b.PROGRAM,b.USERNAME, count(*) from v$process a, v$session b where a.ADDR b.PADDR and b.USERNAME is…

RCNN学习笔记-ResNeXt

论文地址&#xff1a;https://arxiv.org/pdf/1611.05431.pdf Abstract 我们提出了一种简单、高度模块化的图像分类网络体系结构。我们的网络是通过重复一个构建块来构建的&#xff0c;该构建块聚合了一组具有相同拓扑的变换。我们的简单设计产生了一个只有几个超参数可设置的…

JavaScript -- 数组常用方法及示例代码总结

文章目录数组的方法1 Array.isArray()2 at()3 concat()4 indexOf()5 lastIndexOf()6 join()7 slice()8 push()9 pop()10 unshift()11 shift()12 splice()13 reverse()14 sort()15 forEach()16 filter()17 map()18 reduce()数组的方法 Array参考文档&#xff1a;https://develo…

AIoT通用组件服务攻略之设备“收纳”好帮手——分组管理

天翼物联网平台&#xff08;AIoT&#xff09;通用组件服务提供设备分组管理功能&#xff0c;既可将单个产品下的部分设备划成一个分组&#xff0c;也可将多个产品下的设备划成一个统一分组&#xff0c;主要用于对设备进行归类管理&#xff0c;便于对设备进行批量操作。 对设备…

Java中高级核心知识全面解析——类加载过程

一个非数组类的加载阶段&#xff08;加载阶段获取类的二进制字节流的动作&#xff09;是可控性最强的阶段&#xff0c;这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式&#xff08;重写一个类加载器的 loadClass() 方法&#xff09;。数组类型不通过类加载器创…

适用于嵌入式单片机的差分升级通用库+详细教程

1. 什么是差分/增量升级&#xff1f; 借用网上的介绍&#xff1a;适合嵌入式的差分升级又叫增量升级&#xff0c;顾名思义就是通过差分算法将源版本与目标版本之间差异的部分提取出来制作成差分包&#xff0c;然后在设备通过还原算法将差异部分在源版本上进行还原从而升级成目…

Jekyll如何自定义摘要

最近搭建博客网站的时候遇到一个问题&#xff1a;博客的摘要包含了内容的格式&#xff0c;比如下面这张图。 标题的样式显示在摘要中&#xff0c;这可太奇怪了。我在查找文档之后没有想到合适的解决方案&#xff0c;于是乎就去 Jekyll 的项目下面提了个 Issue 问了一下。 在…

js原生实现步骤条

实现思路: 1.定義一個流程數組和一个步骤状态 2.遍历这个流程数组&#xff0c;如果步骤状态大于流程&#xff0c;checked&#xff1d;true&#xff0c; 3.页面输出遍历的流程数组&#xff0c;checked的div点亮 最终效果 <!DOCTYPE html> <html> <title>js原…

音视频开发:直播推流技术指南

一、推流架构 推流SDK客户端的模块主要有三个&#xff0c;推流采集端、队列控制模块、推流端。其中每个模块的主要流程如下&#xff0c;本文的主要目的就是拆分推流流程。 1.1 采集端 视频采集&#xff1a;通过Camera采集视频。 音频采集&#xff1a;通过麦克风采集音频。 …

HTML做一个节日页面【六一儿童节】纯HTML代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

「动态规划学习心得」正则表达式匹配

正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 输入&…

客户管理系统中的常用术语都有哪些 (下)

CRM客户管理系统概念问世的二十多年来&#xff0c;曾帮助过无数企业打造优质的客户关系&#xff0c;带来显著的业绩增长。为了让您有更好的理解&#xff0c;小编把CRM常用术语进行了汇总&#xff0c;希望能够帮助到正在了解CRM的您。 销售方法及营销理念 LTC (Leads To Cash)…

超细节的javaWeb知识点总结

文章目录Servlet系统架构C/S架构B/S架构C/S和B/S结构的系统&#xff0c;哪个好&#xff0c;哪个不好&#xff1f;JavaEE是什么&#xff1f;B/S结构的系统通信原理&#xff08;没有涉及到Java小程序&#xff09;WEB系统的访问过程关于域名&#xff1a;IP地址是啥&#xff1f;端口…

搜索与图论-树与图的广度优先遍历

文章目录一、树与图的广度优先遍历1. 构建2. 遍历3. 具体实现详见例题——图中点的层次二、树与图的广度优先遍历例题——图中点的层次具体实现&#xff08;一&#xff09;1. 样例演示2. 实现思路3. 代码注解4. 实现代码具体实现&#xff08;二&#xff09;1. 代码注解2. 实现代…