Ogre_初学指导_2_"场景绘制"

来源:互联网 发布:如何安装网络电视 编辑:程序博客网 时间:2024/04/16 12:37

此小节主要学习 :

1、在3D空间中的几个基本操作。

2、场景是如何被组织的。

3、操作不同的3D空间。

2、场景组织方式

故意提前讲解。

场景的组织方式就像一棵倒立的树,它由根部(root)不断进行扩展。

每当有新的模型需要加载到场景中,我们必须先把它挂在root节点或者是root节点的子节点(树枝)上。

场景是由N个节点组成,而每个节点上挂载这用户导入的模型。但是这N个节点都是root节点的子孙们。

1、几个基本操作

1)创建场景节点

在上一节中我们创建了一个人物模型,并把它加载到了场景中,但是它是直接attach在rootNode(根节点)上的。

现在我们将创建一个新的场景节点,并将3D模型绑定其上。

老代码是:

Ogre::Entity*ent=mSceneMgr->createEntity("MyEntity","Sinbad.mesh");
mSceneMgr->getRootSceneNode()->attachObject(ent);

我们改为:

Ogre::Entity*ent=mSceneMgr->createEntity("MyEntity","Sinbad.mesh");
Ogre::SceneNode*node=mSceneMgr->createSceneNode("Node1");
mSceneMgr->getRootSceneNode()->addChild(node);
node->attachObject(ent);

  编译、运行。结果一样。

2)场景根节点

调用mSceneMgr->getRootSceneNode()函数将会返回场景的根结点

场景结点是场景管理器的一个成员变量。当我们想要什么显示的时候,我们需要以一种方式把它绑定到场景根
结点上或者一个派生类或子类的结点上。简而言之,子结点需要和根结点保持结点与结点之
间的联系,否则的话,子结点上的模型就得不到渲染。
就像变量名所暗示的那样,场景根结
点是场景的根。因此整个场景将会以某种方式绑定到场景的根结点上。

3)设置场景节点的位置

node->setPosition(10,0,0);

setPosition()用了设置节点的位置,但是这个位置是相对于父节点的位置的。

通过下列代码进行说明:(创建实体2,将其绑定在node2上,但是node2被设置为以前node的子节点)

原代码基础上加:

Entity *ent2 = mSceneMgr->createEntity("MyEntity2","Sinbad.mesh");
SceneNode *node2 = mSceneMgr->createSceneNode("Node2");
node->addChild(node
2);
node2->setPosition(0,10,20);
node2->attachObject(ent2);

运行结果:

模型1的位置是(10,0,0),模型2的位置是(10,10,20)。

4)场景节点位置变动应用:旋转、移动:在下一节说。

3、操作不同3D空间在后边章节讲解。

代码:


#include "ExampleApplication.h"

using namespace Ogre;
class example1 : public ExampleApplication
{
protected:
void createScene()
{
Entity *ent = mSceneMgr->createEntity("MyEntity","Sinbad.mesh");
//mSceneMgr->getRootSceneNode()->attachObject(ent);
SceneNode *node = mSceneMgr->createSceneNode("Node1");
mSceneMgr->getRootSceneNode()->addChild(node);
node->attachObject(ent);
node->setPosition(10,0,0);
Entity *ent2 = mSceneMgr->createEntity("MyEntity2","Sinbad.mesh");
SceneNode *node2 = mSceneMgr->createSceneNode("Node2");
node->addChild(node2);
node2->setPosition(0,10,20);
node2->attachObject(ent2);
}
public:
example1(){}
~example1(){}
};
int main()
{
example1 ex1;
ex1.go();
return 0;
}

原创粉丝点击