OGRE 3D----创建第一个OGRE 3D示例

news2025/2/24 12:07:35

目录

1. OGRE 3D概述

2. OGRE 3D vs VTK

3. 编译OGRE 3D 源码

4. 创建示例和配置其编译环境

5. 配置示例程序的执行环境


1. OGRE 3D概述

OGRE (Object-Oriented Graphics Rendering Engine) 是一个开源的、高级的 3D 图形渲染引擎,它提供了一个抽象层,使得开发者可以专注于创建内容和逻辑,而不必深入底层的图形硬件接口。OGRE 由 C++ 编写,但它支持多种语言绑定,包括 Python 和 .NET 语言。它是跨平台的,支持 Windows、Linux、macOS 等操作系统。

主要特性

  • 场景管理:OGRE 提供了多种场景管理策略,包括八叉树、BSP(二叉空间分割)等,以高效地管理和渲染3D场景。
  • 材质和着色:支持高级材质描述、着色器(包括 HLSL、GLSL、CG)等,允许创建丰富的视觉效果。
  • 网格和动画:支持复杂的网格模型和骨骼动画,包括网格细分、蒙皮、形态混合等功能。
  • 灯光和阴影:提供了多种灯光类型和阴影技术,包括静态阴影、动态阴影等。
  • 渲染系统:支持多种渲染系统后端,如 Direct3D 和 OpenGL,确保了跨平台的兼容性和性能。
  • 插件架构:OGRE 设计了灵活的插件架构,允许扩展新的渲染系统、场景管理器等。

应用领域

OGRE 被广泛应用于游戏开发、模拟、虚拟现实、科学可视化等领域。它的高度可扩展性和强大的功能使其成为专业开发者和爱好者的热门选择。

开发环境

OGRE 的开发活跃,社区支持强大。它提供了详细的文档、教程和示例,帮助开发者快速上手。此外,OGRE 遵循 MIT 许可证,这意味着它可以在几乎任何项目中免费使用,包括商业项目。

2. OGRE 3D vs VTK

OGRE (Object-Oriented Graphics Rendering Engine) 和 VTK (The Visualization Toolkit) 都是强大的开源库,但它们服务于不同的目的和应用领域。

OGRE 3D

  • 主要用途:OGRE 是一个3D图形渲染引擎,主要用于游戏开发、实时3D应用程序、模拟和虚拟现实。
  • 特点
    • 专注于图形渲染,提供高级的渲染接口。
    • 支持多种材质、光照模型和阴影技术。
    • 提供场景管理、动画等功能。
    • 跨平台支持(Windows、Linux、macOS等)。
    • 强调性能和视觉效果。
  • 社区和文档:拥有活跃的社区和丰富的学习资源。
  • 许可证:遵循MIT许可证,允许在商业和非商业项目中免费使用。

VTK

  • 主要用途:VTK 是一个数据可视化库,主要用于科学数据的3D计算机图形学、图像处理和可视化。
  • 特点
    • 提供了一套完整的工具,用于创建复杂的3D可视化应用程序。
    • 支持多种数据格式和可视化算法,如体渲染、等值面提取、向量场可视化等。
    • 包含大量的算法,用于图像处理和3D图形。
    • 跨平台支持(Windows、Linux、macOS等)。
    • 更侧重于科学计算和数据分析的可视化。
  • 社区和文档:具有广泛的文档和示例,社区支持强大。
  • 许可证:遵循BSD许可证,适用于商业和非商业项目。

对比总结

  • 应用领域:OGRE 3D更适合需要高级图形渲染的游戏和实时3D应用,而VTK专注于科学数据的3D可视化和图像处理。
  • 功能重点:OGRE 3D强调图形渲染和视觉效果,VTK提供了强大的数据处理和可视化工具。
  • 社区和资源:两者都有活跃的社区和丰富的学习资源,但它们的专业领域不同。

选择哪一个库取决于你的具体需求:如果你的项目需要高质量的3D图形渲染,OGRE可能是更好的选择;如果项目需要复杂的数据可视化和分析,VTK可能更适合。

3. 编译OGRE 3D 源码

Clone源码并Checkout具体的Tag

#clone source code
git clone https://github.com/OGRECave/ogre.git

#checkout the specified tag
git checkout -b v14.2.5 tags/v14.2.5

编写BAT脚本编译及安装OGRE

configure_and_build_ogre_14_2_5.bat


setlocal EnableDelayedExpansion

set BUILD_DIR=D:\code\orge\ogre

set PYTHONHOME=C:\Python\Python310

set PYTHONPATH=C:\Python\Python310\Lib;C:\Python\Python310\DLLs;C:\Python\Python310\libs

set OGRE_DEPENDENCIES_DIR=D:\code\orge\ogre_v14.2.5\ogre_build\Dependencies

:: Create build and install directories
mkdir "D:\code\orge\ogre_v14.2.5\ogre_build"
mkdir "D:\code\orge\ogre_v14.2.5\ogre_install"

:: Execute cmake from VS build tools to build VTK
cmake -S"D:\code\orge\ogre" ^
-G"Visual Studio 17 2022" ^
-B"D:\code\orge\ogre_v14.2.5\ogre_build" ^
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo ^
-DPYTHON_EXECUTABLE:FILEPATH="C:/Python/Python310/python.exe" ^
-DPYTHON_INCLUDE_DIR:PATH="C:/Python/Python310/include" ^
-DPYTHON_LIBRARY:FILEPATH="C:/Python/Python310/libs/python310.lib" ^
-DIMGUI_DIR:PATH="D:/code/orge/ogre_v14.2.5/ogre_build/imgui-1.90.4" ^
-Dpugixml_DIR:PATH="D:/code/orge/ogre_v14.2.5/Dependencies/lib/cmake/pugixml" ^
-Dassimp_DIR:PATH=D:/code/orge/ogre_v14.2.5/Dependencies/lib/cmake/assimp-5.2 ^
-DZLIB_INCLUDE_DIR:PATH="D:/code/orge/ogre_v14.2.5/ogre_build/Dependencies/include" ^
-DZLIB_LIBRARY_RELEASE:FILEPATH="D:/code/orge/ogre_v14.2.5/ogre_build/Dependencies/lib/zlib.lib" ^
-DOGRE_BUILD_COMPONENT_PAGING:BOOL=ON ^
-DCMAKE_INSTALL_PREFIX:PATH="D:/code/orge/ogre_v14.2.5/ogre_install"

:: Compile code using msbuild:
cd "D:\code\orge\ogre_v14.2.5\ogre_build"
:: Create Release DLL's
"C:/Program Files/Microsoft Visual Studio/2022/Professional/Msbuild/Current/Bin/amd64/MSBuild.exe" OGRE.sln /p:Configuration="RelWithDebInfo"

"C:/Program Files/Microsoft Visual Studio/2022/Professional/Msbuild/Current/Bin/amd64/MSBuild.exe" INSTALL.vcxproj /p:Configuration="RelWithDebInfo"

pause

endlocal

编译时需要连接网络,因为过程中会下载其编译所依赖的库文件,例如:pugixml、zlib。

安装的OGRE库目录在D:\code\orge\ogre_v14.2.5\ogre_install。

4. 创建示例和配置其编译环境

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(OgreDemo)

set(CMAKE_CXX_STANDARD 11)

# Replace this with the path to your Ogre SDK
set(OGRE_HOME "D:/code/orge/ogre_v14.2.5/ogre_install")
set(SDL2_HOME "D:/code/orge/SDL2-2.28.5")

set(CUSTOM_OUTPUT_DIRECTORY "D:/code/test/ogre/testogre/build/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CUSTOM_OUTPUT_DIRECTORY})

# 确保CMake可以找到OGRE的配置文件
list(APPEND CMAKE_PREFIX_PATH "${OGRE_HOME}" "${SDL2_HOME}")
list(APPEND CMAKE_PREFIX_PATH "${OGRE_HOME}")

find_package(OGRE 14.2 REQUIRED COMPONENTS Bites RTShaderSystem)
find_package(SDL2 REQUIRED)

include_directories(${OGRE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS})
link_directories(${OGRE_LIBRARY_DIRS} ${SDL2_LIBRARIES})

add_executable(OgreDemo main.cpp)
target_link_libraries(OgreDemo ${OGRE_LIBRARIES} ${SDL2_LIBRARIES})

main.cpp

// This file is part of the OGRE project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at https://www.ogre3d.org/licensing.
// SPDX-License-Identifier: MIT

#include "Ogre.h"
#include "OgreApplicationContext.h"
#include "SDL.h"

//! [key_handler]
class KeyHandler : public OgreBites::InputListener
{
    bool keyPressed(const OgreBites::KeyboardEvent& evt) override
    {
        if (evt.keysym.sym == SDLK_ESCAPE)
        {
            Ogre::Root::getSingleton().queueEndRendering();
        }
        return true;
    }
};
//! [key_handler]

int main(int argc, char *argv[])
{
//! [constructor]
    OgreBites::ApplicationContext ctx("OgreTutorialApp");
    ctx.initApp();
//! [constructor]

//! [setup]
    // get a pointer to the already created root
    Ogre::Root* root = ctx.getRoot();
    Ogre::SceneManager* scnMgr = root->createSceneManager();

    // register our scene with the RTSS
    Ogre::RTShader::ShaderGenerator* shadergen = Ogre::RTShader::ShaderGenerator::getSingletonPtr();
    shadergen->addSceneManager(scnMgr);

    // without light we would just get a black screen    
    Ogre::Light* light = scnMgr->createLight("MainLight");
    Ogre::SceneNode* lightNode = scnMgr->getRootSceneNode()->createChildSceneNode();
    lightNode->setPosition(0, 10, 15);
    lightNode->attachObject(light);

    // also need to tell where we are
    Ogre::SceneNode* camNode = scnMgr->getRootSceneNode()->createChildSceneNode();
    camNode->setPosition(0, 0, 15);
    camNode->lookAt(Ogre::Vector3(0, 0, -1), Ogre::Node::TS_PARENT);

    // create the camera
    Ogre::Camera* cam = scnMgr->createCamera("myCam");
    cam->setNearClipDistance(5); // specific to this sample
    cam->setAutoAspectRatio(true);
    camNode->attachObject(cam);

    // and tell it to render into the main window
    ctx.getRenderWindow()->addViewport(cam);

    // finally something to render
    Ogre::Entity* ent = scnMgr->createEntity("Sinbad.mesh");
    Ogre::SceneNode* node = scnMgr->getRootSceneNode()->createChildSceneNode();
    node->attachObject(ent);
//! [setup]

//! [main]
    // register for input events
    KeyHandler keyHandler;
    ctx.addInputListener(&keyHandler);

    ctx.getRoot()->startRendering();
    ctx.closeApp();
//! [main]
    return 0;
}

配置SDL2库环境

由于OGRE安装时并没有将SDL2也安装到OGRE库目录中,但示例程序在编译时需要依赖SDL2头文件和库文件,所以我们从网上下载编译好的SDL2库 
https://github.com/libsdl-org/SDL/releases/download/release-2.30.4https://github.com/libsdl-org/SDL/releases/download/release-2.28.5/SDL2-devel-2.28.5-VC.ziphttps://github.com/libsdl-org/SDL/releases/download/release-2.30.4
,当然你也可以收集ogre_build\Dependencies下的SDL2的头文件、LIB文件和DLL文件,然后组成SDL2库目录,当这样不方便。

5. 配置示例程序的执行环境

将ogre_install\bin目录下的exe,DLL,cfg文件都拷贝到示例程序exe所在的目录下。

将ogre_install\Media拷贝到示例程序exe的上一级目录下。

运行示例程序exe,你将看到文章前面那张图的效果。

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

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

相关文章

Mybatis---代理设计模式(超详细)

Mybatis—代理设计模式 文章目录 Mybatis---代理设计模式一、什么是代理设计模式二、静态代理1、定义2、结构3、示例 三、动态代理1、定义2、newProxyInstance ()方法3、示例 四、CGLIB代理1、引入2、定义3、工作原理4、示例 一、什么是代理设计模式 首…

大数据-121 - Flink Time Watermark 详解 附带示例详解

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Unity(2022.3.41LTS) - UI详细介绍- Toggle(切换)

目录 零.简介 一、基本功能 二、属性和设置 三、使用方法 四、优化和注意事项 零.简介 在 Unity 中,Toggle 是一种常用的 UI 组件,用于表示一个布尔值的状态,类似于复选框。 一、基本功能 状态切换:Toggle 有两种状态&…

sqli-lab靶场学习(一)——Less1-4

前言 最近一段时间想切入安全领域,因为本身有做数据库运维工作,就打算从sql注入方向切入。而sql注入除了学习日常书本上的概念外,需要有个实践的环境,刚好看到sqli-lab这个靶场,就打算先用这个来学习。 安装部署 网上…

软考-软件设计师(UML习题)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

梯度弥散问题及解决方法

梯度弥散问题及解决方法 简要阐述梯度弥散发生的原因以及现象针对不同发生原因有什么解决方案1. 使用ReLU及其变体激活函数2. 权重初始化3. 批量归一化(Batch Normalization)4. 残差连接(Residual Connections)5. 梯度裁剪(Gradient Clipping)简要阐述梯度弥散发生的原因…

挂轨巡检机器人在发电厂与煤矿皮带机场景的应用

一、引言 在发电厂和煤矿等重工业领域,皮带机作为关键设备,其运行状态直接关系到生产效率和安全。然而,传统的人工巡检方式不仅效率低下,还存在安全隐患。随着智能巡检技术的不断发展,杭州旗晟智能科技有限公司推出的…

UE5.3_跟一个插件—Socket.IO Client

网上看到这个插件,挺好! 项目目前也没有忙到不可开交,索性跟着测一下吧: 商城可见,售价72.61人民币! 但是,git上有仓库哦,免费!! 跟着链接先准备起来: Documentation: GitHub - getnamo/SocketIOClient-Unreal: Socket.IO client plugin for the Unreal Engin…

(仓颉) 仓颉语言入门

文章目录 ⭐前言🔠1 基本概念🔤Hello World🔤标识符🔤内置类型🔤if表达式🔤for表达式🔤while表达式🔤demo 手动计算Π 🔠2 函数🔤普通函数🔤lambd…

【LeetCode】05.最长回文子串

题目要求 解题思路 这一类型(回文子串)主要有两种解决方法,一种是动态规划,另一种是中心拓展算法。 动态规划: 本质问题就是在i-j区间是不是回文的。这样的话我们在 i 和 j 位置的值相等时,判断如下三种情…

最直接显示 ubuntu 版本号的命令

有时候去看ubuntu版本号,去网上查,很多文章都列出一堆命令,复制命令运行一下,都是打印一些不相关的信息,我只是想看ubuntu版本号而已,能否直接列出版本号就可以了。 有,下面这条命令就是直接的…

STM32+ESP8266+MQTT协议连接阿里云实现温湿度上传

前期步骤: ESP8266下载固件→连接阿里云-CSDN博客 keil文件:大家可以直接下载,也可以在后台私信我获取 《STM32ESP8266MQTT协议连接阿里云实现温湿度上传》 keil文件源码 一、代码修改部分 1、mqtt.h文件中的修改 2、wifi.h文件中的修改 3、main.…

Matplotlib 画布及Figure文字注释添加详解

text() 若要给画布对象或者Figure对象添加注释,常用的为text()方法,分别可以用Figure对象.text()或者画布对象.text()添加文字注释 x, y, s, fontdictNone 上述为text()函数的参数x,y为注释所在的坐标,s为要添加的注释,fontdict为字体样式字典,键包括常见的样式,如‘color’…

微积分直觉:隐含微分

目录 一、介绍 二、梯子问题 三、结论 四、一个额外的例子 一、介绍 让我们想象一个半径为 5 的圆,以 xy 平面为中心。现在假设我们想在点 (3,4) 处找到一条切线到圆的斜率。 好吧,为了做到这一点,我们必须非常接近圆和…

Qt-布局管理

布局管理 Qt布局系统提供了一种简单而强大的方式,可以自动在窗口组件中排列子窗口组件,以确保它们充分利用可用空间。 介绍 Qt包含了一组布局管理类,用于描述窗口组件在应用程序用户界面中的布局方式。当可用空间发生变化时,这…

Typora 写文章时修改图片保存位置

文章目录 为什么要修改图片位置修改图片位置1.打开偏好设置2.修改路径3.再写文章发现图片已经变成了相对路径 为什么要修改图片位置 默认位置不好找 如何修改呢? 修改图片位置 1.打开偏好设置 文件 > 偏好设置 2.修改路径 图像 > 插入图片时 按照下图…

C# 集合(Collection)

集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同…

超市售货管理系统小程序的设计

管理员账户功能包括:系统首页,个人中心,会员管理,供应商信息管理,商品管理,出入库管理,公告管理,轮播图信息 微信端账号功能包括:系统首页,公告,…

Midjourney 随机风格 (Style Random),开启奇幻视觉之旅

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: Midjourney 最近推出了 "Style Random"(随机风格),这项功能可以让我们使用独特的随机 sref 代码创建图像,从而每次都能获得不同的美感。通过对这些功能的探索和尝试,我发现了一些很棒…

vscode安装使用plantuml插件

使用 VSCode 插件 如果你在 Visual Studio Code 中使用 PlantUML 插件,你可以按照以下步骤生成图片: 安装 PlantUML 插件: 在 VSCode 的扩展市场中搜索并安装 PlantUML 插件。 配置插件: 打开设置,确保插件配置正确。…