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

2024-09-07 02:04
文章标签 创建 3d 第一个 示例 ogre

本文主要是介绍OGRE 3D----创建第一个OGRE 3D示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

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 EnableDelayedExpansionset BUILD_DIR=D:\code\orge\ogreset PYTHONHOME=C:\Python\Python310set PYTHONPATH=C:\Python\Python310\Lib;C:\Python\Python310\DLLs;C:\Python\Python310\libsset 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"pauseendlocal

编译时需要连接网络,因为过程中会下载其编译所依赖的库文件,例如: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 rootOgre::Root* root = ctx.getRoot();Ogre::SceneManager* scnMgr = root->createSceneManager();// register our scene with the RTSSOgre::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 areOgre::SceneNode* camNode = scnMgr->getRootSceneNode()->createChildSceneNode();camNode->setPosition(0, 0, 15);camNode->lookAt(Ogre::Vector3(0, 0, -1), Ogre::Node::TS_PARENT);// create the cameraOgre::Camera* cam = scnMgr->createCamera("myCam");cam->setNearClipDistance(5); // specific to this samplecam->setAutoAspectRatio(true);camNode->attachObject(cam);// and tell it to render into the main windowctx.getRenderWindow()->addViewport(cam);// finally something to renderOgre::Entity* ent = scnMgr->createEntity("Sinbad.mesh");Ogre::SceneNode* node = scnMgr->getRootSceneNode()->createChildSceneNode();node->attachObject(ent);
//! [setup]//! [main]// register for input eventsKeyHandler 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,你将看到文章前面那张图的效果。

这篇关于OGRE 3D----创建第一个OGRE 3D示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT