Ogre应用指南

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

如何用ExampleApplication建立一个应用程序
如果你还不知道这个是如何工作的,你必须在Ogre指南章节中读更多关于这个的知识:完全理解它确实很重要。简言之,它需要创建一个继承自ExampleApplication的类(class)。这个类能够执行函数createScene()及createFrameListener()。它大致上看上去如下:

#include "ExampleApplication.h"
class MyClass: public ExampleApplication,
{
public:
MyClass(void);
~MyClass(void);
protected:
void createScene(void);
void createFrameListener(void);
};

你还会需要一个创建MyClass实例的.cpp文件并运行它。通常是这个样子(取自于“Guide To Setting Up Application Project Files”-tutorial):
#include "Ogre.h"
#include "MyClass.h"
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
MyClass app;
try
{
app.go();
}
catch( Exception& e )
{
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!",
MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occured: %s\n", e.getFullDescription().c_str());
#endif
}
return 0;
}


如何在场景(scene)中放置一个3D模型

一个3D模型是一个实体(Entity)并且它必须附属于一个场景结点(SceneNode)以被放置在场景中。场景结点能够由SceneManager中的rootScnenNode产生。创建一个实体和场景结点并把实体挂在场景结点上是这个样子:
Entity* thisEntity = mSceneMgr->createEntity("nameInTheScene", "FileName.mesh"); 
SceneNode* thisSceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
thisSceneNode->attachObject(thisEntity);


如何从场景中移除一个实体
为了移除一个实体(Entity),你必须把实体从它的场景结点中分开,删除它如果需要的话还要销毁场景结点,这必须用SceneManager来完成。如果你有一个叫做myNode的SceneNode*,你可以用下面的代码完全地删除它的内容(MovableObjects和子场景结点)及结点本身:
SceneNode* parent = entity->getParentSceneNode();
parent->detachObject(entity);
mSceneMgr->destroyEntity(entity->getName());
// entity is now destroyed, don't try to use the pointer anymore!
// optionally destroy node
mSceneMgr->destroySceneNode(parent->getName());


如何移动、重置、缩放及旋转一个场景节点
如果你有一个连接有多个可移动对象(MovableObject),像实体、灯光及相机的场景结点,你可以用多个函数移动它,查看这些的API。下面的函数分别是移动(move)、重置(reposition)、缩放(scale)及绕它的X-,Y-,Z-轴进行旋转:
thisSceneNode->translate(10, 20, 30);
thisSceneNode->setPosition(1.8, 20.1, 10.5);
thisSceneNode->scale(0.5, 0.8, 1.3);
thisSceneNode->pitch(45);
thisSceneNode->yaw(90);
thisSceneNode->roll(180);


如何在场景那个中放置光源
为了向场景中添加一个光源,你必须向SceneManager请求一个。然后你可以对它进行设置,下面给出一些设置的例子:
Light* myLight = mSceneMgr->createLight("nameOfTheLight");
myLight->setType(Light::LT_POINT);
myLight->setPosition(200, 300, 400);
myLight->setDiffuseColour(1, 1, 0.7);
myLight->setSpecularColour(1, 1, 0.7);

你还可以把一个光源连接到一个场景结点上。下面的代码创建一个场景结点并把myLight连接到上面:
SceneNode* thisSceneNode = static_cast<SceneNode*>(mSceneMgr->getRootSceneNode()->createChild());
thisSceneNode->attachObject(myLight);


如何设置环境光
环境光由SceneManager进行控制,因此你可以用SceneManager来对它进行设置:
mSceneMgr->setAmbientLight(ColourValue(0.2, 0.2, 0.2));


如何控制相机
ExampleApplication中的标准相机叫做mCamera并且它在继承自ExampleApplication的类中是可用的。下面的代码改变它的位置,改变它的朝向点,创建一个SceneNode并把相机连接到上面:
mCamera->setPosition(0, 130, -400);
mCamera->lookAt(0, 40, 0);
SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();

camNode->attachObject(mCamera);
用鼠标控制相机

这个代码使得为RTS(译者注:Realtime Strategy Game,即时战略类游戏,对应回合制战略游戏)风格的游戏使用标准相机移动接口变的容易。当按下左键时相机围绕着一个固定的点移动。拉伸(zooming)通过滚轮或点击中键及上下移动鼠标来完成。
Real MoveFactor = 60.0 * evt.timeSinceLastFrame;
// Move the camera around with the left button
if (mInputDevice->getMouseButton(1)) {
SceneNode *camNode = mCamera->getParentSceneNode();
if (camNode == 0) {
std::cerr << "mCamera isn't attached to any SceneNode !" << std::endl;
}
camNode->yaw(Degree(mInputDevice->getMouseRelativeX() * MoveFactor * -0.1));
camNode->pitch(Degree(mInputDevice->getMouseRelativeY() * MoveFactor * -0.1));
}
// Zoom with the middle button...
if (mInputDevice->getMouseButton(2)) {
mCamera->moveRelative(Vector3(0.0, 0.0, -0.5)
* mInputDevice->getMouseRelativeY() * MoveFactor);
}
// ... and the wheel ;-)
mCamera->moveRelative(Vector3(0.0, 0.0, -0.1)
* mInputDevice->getMouseRelativeZ() * MoveFactor);


如何向场景中添加布告板
布告板(Billboard)是一个总是面向相机的正方形。它被认为是一个精灵(sprite)。为产生一个布告板,你必须首先产生一个BillboardSet。然后billboard能被添加到上面一个给定的位置。BillboardSet是一个MovableObject,因此应该添加到SceneNode上。整个程序如下:
SceneNode* myNode = static_cast<SceneNode*>(mSceneMgr->getRootSceneNode()->createChild());
BillboardSet* mySet = mSceneMgr->createBillboardSet("mySet");
Billboard* myBillboard = mySet->createBillboard(Vector3(100, 0, 200));
myNode->attachObject(mySet);


如何用ExampleFrameListener创建基本的FrameListener
帧兼听器(FrameListener)给你在每帧开始和结束时做一些事情的机会。首先你必须创建一个继承自ExampleFrameListener的类并且在这个类中你可以执行frameStarted()和frameEnded()。看起来就像这样子:
#include "ExampleFrameListener.h"
class myFrameListener: public ExampleFrameListener
{
public:
myFrameListener(RenderWindow* win, Camera* cam);
~myFrameListener(void);
bool frameStarted(const FrameEvent& evt);
bool frameEnded(const FrameEvent& evt);
};

构造函数应该调用它的父构造函数,像这样子:
myFrameListener::myFrameListener(RenderWindow* win, Camera* cam): ExampleFrameListener(win, cam){}

你还必须向Root注册你的FrameListener,这可以在createFrameListener()中完成——继承自ExampleApplication的类的函数。你可以向root注册尽你希望多的FrameListener。这个过程如下:
void createFrameListener(void)
{
MyFrameListener listener = new MyFrameListener(mWindow, mCamera);
mRoot->addFrameListener(listener);
}


如何在FrameListener中从scene中控制对象
如果你想在FrameListener中控制场景中的一些对象,FrameListener有权访问它。一个简单方法是在构造FrameListener时提供一个指向它的指针。现在这个构造函数该是这样子:
myFrameListener(RenderWindow* win, Camera* cam, Car* car);


如何得到自前一帧以后的时间
在FrameListener的frameEnded()和frameStarted()函数中你可以用下面的方法得到以秒为单位的时间(这是一个浮点数):
bool frameStarted(const FrameEvent& evt)
{
float time = evt.timeSinceLastFrame;
return true;
}

现在你可以马上用每秒的速度乘以这个浮点数来得到自上一帧后的移动。这可以为游戏设定独立的帧率。

如何响应按键
你可以在FrameListener的函数frameEnded()和frameStarted()中通过先让Ogre捕获然后再检查哪一个键被按下来响应按键。你只需要每帧捕获一次InputDevice。过程是这样子:
mInputDevice->capture();
if (mInputDevice->isKeyDown(Ogre::KC_DOWN))
{
//react however you like
}
if (mInputDevice->isKeyDown(Ogre::KC_UP))
{
//react however you like
}


如何确保按键在彼此太短时间内不响应
如果你用上面的方法响应按键,它们每帧都会响应。比如说你想每帧大约响应两次,你可以通过设置计时器(timer)来完成。为了能够使不同的函数调用来访问它,timer必须在它自己的类中而不是在函数中
。执行这个是这样子:
class myFrameListener: public ExampleFrameListener
{
protected:
float buttonTimer;
public:
myFrameListener(RenderWindow* win, Camera* cam): ExampleFrameListener(win, cam)
{
buttonTimer = 0;
}
bool frameStarted(const FrameEvent& evt)
{
float time = evt.timeSinceLastFrame;
buttonTimer -= time;
mInputDevice->capture();
if (mInputDevice->isKeyDown(Ogre::KC_DOWN) && buttonTimer <= 0)
{
buttonTimer = 0.5;
//react however you like
}

return true;
}
};


如何退出应用程序
你可以通过在FrameListener中frameStarted()或frameEnded()中返回false来退出你的程序。如果你想把这个关联在键盘上的escape按钮上,用下面的方法:
bool frameStarted(const FrameEvent& evt)
{
mInputDevice->capture();
if (mInputDevice->isKeyDown(Ogre::KC_ESCAPE))
return false;
return true;
}


如何在运行过程中从场景中高效地添加和移除3D对象
在createScene()函数中你可以从一个文件中加载meshes,但是如果要在运行时添加一个新的对象这样做就太慢了(虽然在一个很简单的程序中看不出速度上的差别)。为了添加对象更快,你可以在createScene()函数中加载许多meshes然后在运行时从栈(stack)中把它们取出来。在对象不再被使用后,你可以把它们放回栈中为以后使用。这个的应用的一个好的例子是发射火箭:它们必须在开火的时候创建并在爆炸后被移除。

为了能够总是访问到这个栈,你可以使它是一个全局变量(global variable)或通过一个singleton访问它。后者更漂亮,但是要用更多的代码因此在这个例子中我不这样做。所以你在某处定义一个储存Entities的栈:
stack rocketEntities;

在createScene()中用许多rockets填充这个栈。每一个Entity此时被设置为不可见并且必须有一个唯一的名字,这个可以用sprintf()函数来完成。这一切如下所示:
for (unsigned int t = 0; t < 100; t++)
{
char tmp[20];
sprintf(tmp, "rocket_%d", t);
Entity* newRocketEntity = mSceneMgr->createEntity(tmp, "Rocket.mesh");
newRocketEntity->setVisible(false);
rocketEntities.push(newRocketEntity);
}

此刻当创建一个新的Rocket时我们可以从rocketEntities中取出一个mesh。在这个例子中我在Rocket构造函数中做这些,并在析构函数中把它压回栈中。在析构函数中为了能够从场景中取回Entity,我把它的名字存储在rocketEntityName中。而且我把rocket恰当地放在构造函数中。为了使这一切工作,SceneManager在整个程序中必须是可用的,为此通过让它是一个全局变量(在所有class的外面)来完成。我还在在构造函数和析构函数中执行创建和销毁SceneNode。至此这个Rocket-class看起来如此:
class Rocket
{
protected:
SceneNode* rocketNode;
string rocketEntityName;
public:
Rocket(const Vector3& position, const Quaternion& direction)
{
rocketNode = static_cast<SceneNode*>(sceneMgr->getRootSceneNode()->createChild());
Entity* rocketEntity = rocketEntities.top();
rocketEntities.pop();
rocketEntity->setVisible(true);
rocketEntityName = rocketEntity->getName();
rocketNode->attachObject(rocketEntity);
rocketNode->setOrientation(direction);
rocketNode->setPosition(position);
}
~Rocket()
{
Entity* rocketEntity = static_cast<Entity*>(rocketNode->detachObject(rocketEntityName));
rocketEntity->setVisible(false);
rocketEntities.push(rocketEntity);
sceneMgr->getRootSceneNode()->removeAndDestroyChild(rocketNode->getName());
}
};

如果你使用这个结构,你应该意识到这个事情:如果没有rockets剩余会发生错误。你可以通过检查这个Entities栈是否为空,如果为空就加载新的meshes到栈中来解决这个问题。

如何显示一个Overlay(及隐藏)
为了显示和隐藏一个Overlay,你首先必须用OverlayManager(这是一个singleton)得到一个指向它的指针。如果你定义了一个名字是“myOverlay”的.overlay脚本,你可以用下面的代码获取、显示并隐藏它:
Overlay* thisOverlay = static_cast<Overlay*>(
OverlayManager::getSingleton().getByName("myOverlay"));
thisOverlay->show();
thisOverlay->hide();


如何改变TextArea中的文本
你可以在运行时间改变GUI中Containers和Elements中所有的参数(parameter)。为此,首先你必须得到一个你想要的Element或Container的指针,如果是基于你想做的东西的需要就把它设计成那种类型。得到一个指向在.overlay脚本中定义为“myTextArea”的TextArea的指针并改变其caption类似这样:
OverlayElement* thisTextArea = OverlayManager::getSingleton().getOverlayElement("myTextArea");
thisTextArea->setCaption("blaat");

这个例子中不需要casting,因为每个OverlayElement都有caption。如果你想设置一个OverlayElement类型的特殊设置,你必须把它设计为那种类型。改变一个textArea的font-name类似这样:
TextAreaGuiElement* thisTextArea = static_cast<TextAreaOverlayElement*>(
OverlayManager::getSingleton().getOverlayElement("myTextArea"));
thisTextArea->setFontName("RealCoolFont");

如何显示鼠标指针(mouse-cursor) 
这一条已经过时了。新的CEGUI方法的详述在这里:
How To Show The Mouse Cursor, 以及这里: Intermediate Tutorial 3
如果你想在屏幕上显示鼠标指针,你须做两件事:设置它为显示并告诉FrameListener追踪它。令它显示可以如下做:

GuiContainer* cursor = OverlayManager::getSingleton().getCursorGui();
cursor->setMaterialName("Cursor/default");
cursor->setDimensions(32.0/640.0, 32.0/480.0);
cursor->show();

让FrameListener追踪它应在它的父构造函数中通过设置它的最后的boolean参数为true来做。至此这个构造函数看起来是这个样子:
myFrameListener::myFrameListener(RenderWindow* win, Camera* cam)
: ExampleFrameListener(win, cam, false, true){}

注意这样做后,因为mInputDevice的capture()函数和isKeyPressed()函数不再正确地工作所以这个特殊的FrameListener对按下按钮操作不再反应。现在需要一个不同的FrameListener来执行键盘输入。

如何创建一个工作按钮(working button)
这一条已经过时并由cegui方案替代。
你可以在Overlay脚本中用类似下面的句法定义一个button,这对设置所有的这些material很重要:
container Button(myButton)
{
metrics_mode relative
horz_align left
vert_align top
top 0.1
left 0.1
width 0.18
height 0.1
material NCG/GuiSession/RedMaterial
button_down_material NCG/GuiSession/RedMaterial
button_up_material NCG/GuiSession/RedMaterial
button_hilite_down_material NCG/GuiSession/RedMaterial
button_hilite_up_material NCG/GuiSession/RedMaterial
button_disabled_material NCG/GuiSession/RedMaterial
}

Buttons在Ogre中不是标准的,因此你须确保它们能在文件夹ogrenew\PlugIns\GuiElements\Include中被编译器(compiler)找到。现在你可以包含它:
#include "OgreButtonGuiElement.h"

为使这个button工作,一个ActionListener必须被注册到它上面,这可以如下完成:
ActionTarget* thisButton = static_cast<ButtonGuiElement*>(
GuiManager::getSingleton().getGuiElement("myButton"));
thisButton->addActionListener(this);

此例中假设‘this’是一个ActionListener(默认不是这样子的)。当然任何ActionListener都可以,不必是‘this’。你可以通过继承ActionListener来使一个类是一个ActionListener并执行actionPerformed()。这个过程类似这样:
class Listener: public ActionListener
{
public:
void actionPerformed(ActionEvent *e);
};


如何找出哪个按钮被按下
这一条已经过时并由cegui方案来替代。
如果你注册一个ActionListener给几个button,它们会调用同一个函数actionPerformed()。你可以通过比较它的名字与ActionEvent e的名字来找出是哪个button被按下。如下:
#include
void actionPerformed(ActionEvent *e)
{
std::string action = e->getActionCommand();
if (action == "myButton")
{
//handle the button-press
}
}


如何使用ActionListener退出应用程序
这个条目已经过时,能用cegui方案代替。
退出应用程序可以在FrameListener中的frameStarted()函数和frameEnded()函数完成,而不是在actionPerformed()函数中。那么我们要怎么做呢?为此我们可以介绍一个简单的FrameListener,如果要求退出它只作退出而不做其他任务。这个FrameListener看起来如下(来自于Ogre中提供的Gui-demo):
#include "ExampleFrameListener.h"
class QuitListener: public ExampleFrameListener
{
public:
QuitListener(RenderWindow* win, Camera* cam): ExampleFrameListener(win, cam, false, false)
{
quit = false;
}
bool frameStarted(const FrameEvent& evt)
{
if (quit)
return false;
return true;
}
void scheduleQuit(void)
{
quit = true;
}
protected:
bool quit;
};

至此如果你有一个指向QuitListener的指针,你可以通过调用scheduleQuit()来确定退出时间并且QuitListener会在下一帧开始前执行它。

如何获得一个不同的SceneManager
场景是通过一个指示是哪种场景类型的标志符来自动选择的。这个过程是在ExampleApplication中完成的,因此要改变它,你必须改变ExampleApplication。通常,ExampleApplication包含下面的代码:
virtual void chooseSceneManager(void)
{
// Get the SceneManager, in this case a generic one
mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
}

你可以更改ST_GENERIC为下面的任意标志符来获得一个适应你的特殊场景的场景管理器(SceneManager):

ST_GENERIC

ST_EXTERIOR_CLOSE

ST_EXTERIOR_FAR

ST_EXTERIOR_REAL_FAR

ST_INTERIOR

如何有效地获得所有可能碰撞的列表
Ogre可以为你提供一个可能碰撞的所有对象的列表。不在碰撞中的封闭的对象也在这个列表中,所以然后你须自己确定哪一个是碰撞对象。你可以用IntersectionSceneQuery来寻找这个碰撞列表,可以用下面的代码来得到:
IntersectionSceneQuery* intersectionQuery = sceneMgr->createIntersectionQuery();

现在你可以找到一个所有可能碰撞的列表:
IntersectionSceneQueryResult& queryResult = intersectionQuery->execute();

如果你想在更形场景前得到几次这个列表,你没必要让Ogre一次次地计算。你可以用下面的代码不用新的计算而再次得到相同的列表:
IntersectionSceneQueryResult& queryResult = intersectionQuery->getLastResults();

使用后,你可以存储IntersectionSceneQuery为以后使用或移除它。如果移除它,你须用下面的代码告诉SceneManager来完成:
mSceneMgr->destroyQuery(intersectionQuery);

IntersectionSceneQueryResult是一个可移动对象对(pairs of MovableObjects)的列表。它的应用的一个例子是获得发生第一次碰撞的两个对象的名字:
queryResult.movables2movables.begin()->first->getName();

有关结果类型的详细资料参看Ogre-API。

如何找出一个MoveableObject属于你的哪个对象
IntersectionSceneQuery传递过来的碰撞对象列表是可移动对象(MovableObject)的,但是一般来说你可能想把这些关联到你自己的场景中的自定义对象。为此,你可以把指针连接到你自己的object中指向一个MovableObject,稍后取回指针。如果你有一个Entity(是一个MovableObject)和一个自定义object(就像下面的myRocket),你可以把你的自定义object挂到Entity上,如下:
Entity* myEntity = sceneMgr->createEntity("myEntity", "Rocket.mesh");
Rocket* myRocket = new Rocket();
myEntity->setUserObject(myRocket);

现在你可以用下面的代码从Entity中得到一个指向myRocket的指针:
myEntity->getUserobject();

为了使你自定义的类工作,它必须继承自UseDefinedObject。这还允许你找出返回的object是哪种class,这样你可以cast it back。现在Rocket的定义是这样子:
class Rocket: public UserDefinedObject
{
public:
const string& getTypeName(void) const
{
static const string typeName = "Rocket";
return typeName;
}
};

在检测出哪个MovableObjects与碰撞相关后,你也可以找出你自己的哪些objects与碰撞相关。

如何从碰撞检测中排除对象
你可以使用标记(flag)来从碰撞检测(collision detection)中排除某些物体。你可以给任何可移动物体添加标记,比如下面例子中的100:
Entity* ground = mSceneMgr->createEntity("ground", "Ground.mesh");
ground->setQueryFlags(100);

现在你可以告诉你的IntersectionSceneQuery来排除物体用这个标记从它的intersections列表中通过设置它的mask。如下所示:
IntersectionSceneQuery* intersectionQuery = sceneMgr->createIntersectionQuery();
intersectionQuery->setQueryMask(~100);

Ogre一步一步学开发》 一、Ogre源码编译与安装,从源代码开始构建Ogre图文教程(Ogre 1.12.1 Source + VS2019 + Windows10) 一、电脑需要已经安装下列软件环境: Visual Studio 2017 下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ CMake 3.14.1 下载地址: https://cmake.org/download/ 下载文件 cmake-3.14.1-win64-x64.msi 后安装 二、Ogre源码编译与安装 1. htt... 阅读详情

相关推荐

OGRE教程(一):SceneNode, Entity, SceneManager

    原始作者:Clay Culver 中文译者:Antking  OGRE教程(一)  OGRE教程(二)注意:这篇文章是针对OGRE 1.0.0,如果你使用其他的版本,如果遇到问题请到论坛中讨论。目录1 读者对象2 简介3 如何开始4 OGRE如何工作  4.1 SceneManager 基础  4.2 Entity 基础  4.3 SceneNode 基础5 你的第一个OGRE程序6 坐标

csdn_gamedev的专栏 4018

OGRE教程:SceneNode, Entity, SceneManager

OGRE教程(一)   OGRE教程(二) 注意:这篇文章是针对OGRE 1.0.0,如果你使用其他的版本,如果遇到问题请到论坛中讨论。 目录 1 读者对象 2 简介 3 如何开始 4 OGRE如何工作   4.1 SceneManager 基础   4.2 Entity 基础   4.3 SceneNode 基础 5 你的第一个OGRE程序 6 坐标和向量

flyingleo1981的专栏 1284

C++ 3D应用开发:Ogre渲染引擎与MyGUI界面库集成实战指南

在C++高性能应用开发领域,图形用户界面(GUI)与3D渲染引擎的集成是构建游戏、仿真及工业设计软件的核心技术。其原理在于通过事件驱动架构,将界面交互逻辑与底层图形渲染管线解耦,从而实现高效、响应灵敏的用户体验。这项技术的价值在于,它允许开发者利用专业的渲染引擎处理复杂的3D场景,同时借助成熟的GUI库快速构建丰富的交互界面,极大地提升了开发效率和软件表现力。典型的应用场景包括游戏中的HUD、角色属性面板、仿真系统的控制台以及可视化工具的操作界面。本文以Ogre渲染引擎和MyGUI库这一经典组合为例,深入剖

weixin_29248611的博客 299

Ogre 实用技巧

如何用ExampleApplication建立一个应用程序 如果你还不知道这个是如何工作的,你必须在Ogre指南章节中读更多关于这个的知识:完全理解它确实很重要。简言之,它需要创建一个继承自ExampleApplication的类(class)。这个类能够执行函数createScene()及createFrameListener()。它大致上看上去如下: #include "Examp...

weixin_30594001的博客 213

Ogre SDK 18.1(for VS2010)的安装与环境配置资料整理

Ogre SDK 18.1(for VS2010)的安装与环境配置资料整理这几天因为要用到Ogre,所以自己尝试根据网上的教程安装SDK,花的时间总共加起来有1天左右。在这一天的安装过程中,我发现其实网上还是有很多帖子对可能发生的问题写出了解决办法。在此做一个随笔,把自己遇到的问题和认为写的比较好的帖子整理出来。 Ogre SDK的下载网址是: http://www.ogre3d.org/dow

hsskaaa的专栏 892

OGRE组件化开发:Bites、Overlay、RTShaderSystem的深度应用指南

OGREObject-Oriented Graphics Rendering Engine)是一个面向场景、灵活且功能强大的3D引擎,支持C++、Python、C#和Java等多种编程语言。本文重点探讨OGRE组件化开发中三个核心组件:Bites、Overlay和RTShaderSystem的深度应用,帮助开发者快速构建高质量的3D应用程序。 ## 为什么选择OGRE组件化开发?✨ OGRE

gitblog_00852的博客 340

MyGUI与Ogre集成:构建高性能3D应用界面的完整指南

MyGUI是一个快速、灵活且简单的跨平台GUI库,专门为游戏和3D应用程序设计。如果你正在寻找一个强大的**MyGUI Ogre集成**方案来构建高性能的3D应用界面,那么这篇**完整指南**将为你提供从入门到精通的全面指导。通过MyGUI与Ogre引擎的完美结合,你可以轻松创建出既美观又高效的3D用户界面,为你的游戏或仿真应用增添专业级的交互体验。 ## 🚀 为什么选择MyGUI与Ogre

gitblog_00549的博客 1096

Ogre 配置

环境:win7+vs2010+orge1.8.1+DXSDK_Jun10

N的专栏 4240

转:Ogre学习记录

1: 设计初衷它设计初衷是完全跨平台的。抽象的接口隐藏了平台相关的细节。它设计初衷是大幅度支持扩展的。支持多种场景类型,独立出平台和3D接口限制。2: 基本类结构关系Roo:对象为一切的入口,它负责创建Ogre的所有基础元素,三大基础元素大致包括:场景管理器,绘制系统,资源管理器。场景管理器:场景节点,动态对象。资源管理器:资源组管理,资源管理渲染模块:硬件缓冲区管理,渲染系统,渲染窗口3:关键词...

weixin_33919950的博客 161

Visual Studio 2010 配置Ogre

简介: 这部分指令将会指导你从头开始建立一个Visual Studio C++的项目,如果你想了解应用程序向导为你做了哪些工作,这部分指示是很有用的。当你已经看完了这部分指南的时候,你应该要具备成功编译一个工作的Ogre应用程序的能力,然后你才能继续深入。 1.准备前提 .Visual Studio 2010已安装 .Ogre SDK 1.7版本或更高已安装 ...

weixin_30751947的博客 58

Ogre中的动画

Ogre中Animation是一块非常重要的部分,但是笔者在学习Ogre的动画时遗憾的发现关于Ogre中动画的资料非常的少,Ogre的sample中只有最简单的导入一个骨骼动画的例子,在网上也很少有人谈及,Ogre Wiki中的教程也是边边角角,不知这么重要的部分为什么不做一个全面的tutorial。我从网上的仅有的一些资料和自己的亲自试验总结了一下基本的Ogre动画的使用,当然Ogre的动画模

狼牙 650

VS2010下搭建Ogre+CEGUI+OpenAL环境

一、相关SDK的准备1、Ogre 3D<br />Ogre 3D是一个成熟,稳定,可靠,灵活,跨平台,而且拥有丰富功能实时3D图形库,几乎拥有了商业3D渲染引擎的全部特性,甚至在某些方面超越了它们。<br />       多的就不介绍了,相关资料可以从Ogre的官网www.ogre3d.org上获得。写这篇博客的时候Ogre的最新版本是1.7.1,可以通过http://www.ogre3d.org/download获得。这里直接下载OGRE 1.7.1 SDK for Visual C++ .Net 20

希易的专栏 4037

OGRE 3D图形引擎中文快速入门指南

OGREObject-Oriented Graphics Rendering Engine)是一个功能强大且灵活的3D图形引擎,特别适合用于游戏、模拟、虚拟现实、视觉效果等领域。OGRE的架构基于组件的设计原则,其核心类库主要涵盖了场景管理、渲染、资源管理、输入处理等方面。核心类库主要包含以下几部分:Root: OGRE的入口类,负责初始化整个引擎,提供全局访问点。: 负责管理场景中的所有对象,包括灯光、摄像机、实体等。Camera: 代表观察场景的虚拟摄像机。

weixin_29717341的博客 530

This page needs work The Complete Blanks Guide To Using The OGRE SDK AppWizard

Table of contents IntroductionGet ItInstall It OGRE SDKOGRE AppWizard Windows 95/98/2000/Me/XPWindows Vista / Windows Seven Use it Create a New ProjectFollow the WizardBuild your Pr

feiren127的专栏 1328

OGRE3D从新手到入门周边工具集

经过前边的学习相信大家对ogre的基本的使用都有个清楚的了解了,是不是想试试用ogre做一个自己的3d项目呢,呵呵,我当时的感觉就是尽快的用ogre做一个自己的3d游戏,不过回头又想想,ogre仅仅是个3dt图形渲染引擎,要做3d游戏,还需要的东西很多,比如物理,音效,网络(本教程内将不涉及),界面以及输入(这里咱们用ogre自带的cegui和ois),以及AI呵呵,总之一个游戏包含的东西太多,咱

愤怒的小小强 1001

Ogre学习心得

1.ogre的资源文件用文本格式打开:.material    可编辑.mesh      不可编辑(需通过OgreXmlConverter.exe转换才可看).skeleton  不可编辑(需通过OgreXmlConverter.exe转换才可看).particle    可编

848

Start Game with OGRE

#include "ExampleApplication.h" #include #include #include class GameListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener { public: GameListener(RenderWindow* win, Camera* cam) : ExampleFrameListener(win,

Clean Sky 740

Ogre Beginner Guider】第一章 配置OGRE

在使用Ogre3DSDK之前我们需要配置IDE 1.新建一个空工程 2.在工程里新建一个文件,命名为main.cpp 3.添加一个main方法: intmain(void) { return0; } 4.在该文件开头部分包含上ExampleApplication.h文件: #include"Ogre\ExampleApplication.h" 5.添加“你...

weixin_30388677的博客 93
上一篇: 显卡类型和shader版本大致对应列表
下一篇: 程序异常处理
linxv01
博客等级 码龄19年 2粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值