代码改变世界

MOGRE学习(三) Mogre的SceneNode及Entity

2011-12-04 19:59  石头、  阅读(549)  评论(0编辑  收藏  举报

在这里先自己编写个类,继承Example(Example是一个示例的基类,已经载入了Mogre所需要的资源,我们可以用它来做一些测试用)。

接下个第一件要做的事就是给场景来点光,要不,黑漆漆的,怎么自己我们做了些什么?(虽然有些事在关灯的事候做最适宜--)。在这里,我们要用到AmbientLigh属性,称环境光,然后设定我们想要显示的光源颜色。我们在 CreateScene 的方法中添加下面的代码:

mSceneMgr.AmbientLight = new ColourValue(111);

添加了环境光之后,现在我们可以建立模型了,我们敲入下面的代码:

Entity ent = mSceneMgr.CreateEntity("Head""ogrehead.mesh"); 

Entity是一个实体类,一般都用来做三维模型实体类。 在上面这行代码中,我们调用了CreateEntity方法来创建模型,其中第一个参数是标识名,第二个参数是模型文件。好了,现在我们已经创建了Entity对象,但单单是Entity对象,模型还是不会被显示的,我们需要创建SceneNode 让Entity去附加在上面,我们继续敲入下面这行代码:

 

 

 

SceneNode node = mSceneMgr.RootSceneNode.CreateChildSceneNode("HeadNode");
node.AttachObject(ent);

 

这时我们看到,我们是坐根节点去创建SceneNode的, 调用了CreateChildSceneNode方法,其中,参数为节点标识名。然后用节点的AttachObject使用node与ent关联上。

在深入了解Mogre之前 ,我们首先要去认清Mogre的坐标系统。mogre像其它引擎一样,使用X轴与Z轴作为水平面,以Y轴作为垂直轴。X轴以右方为正方向,Y轴以向上为正方向,而Z轴则是以使用者为正方向。如图所示:

 

现在我们要使上面创建的模型面向我们,应该怎么做呢?其实这是一个关系到Camera与Mesh的事了。Camera在以后的讲述中会讲到,而在建模与输出成Mesh的时候,也会影响到模型的正向,所以,在没有设定方向的时候,Entity的默认方向则为Mesh文件输出的方向。在以后的开发中,我们会经常用到Vector类的表示Entity的位置与方向。而在Moger中,有Vector2,Vector3及Vector4。而Vector3我们会用得比较多,如果用Vector类了解不深,建议去看看官方的资料,要不在以后的设计中会一头雾水,这是比较重要的。

在了解了Mogre的坐标系统后,我们再创建另外一个模型显示,敲入下面的代码,我们看看会发生什么。

Entity ent2 = mSceneMgr.CreateEntity("Head2""ogrehead.mesh");
SceneNode node2 = mSceneMgr.RootSceneNode.CreateChildSceneNode("HeadNode2"new Vector3(10000));
node2.AttachObject(ent2); 

 好了,现在我们看到了两个一模一样的怪物头像了,而且是并排的。那么我们做了些什么呢,与上面的代码相比?第一,我们只是稍微改变了Entity与SceneNode的命名;第二,我们把第二个SceneNode的开始位置沿着X轴平移了100个单位。

   Entity 类在Mogre里占居着非常重要的地位,然后我们在这里却不先深入了解它先,仅仅做个开始。但是,有些重要的方法与属性还是需要先认识一下。首先是 Entity.Visible. 我们可以设置Visible为True或否来决定Entity是否显示;不过,假如你需要设置一个隐藏一个Entity,而后面去显示出来,可以不用刻意用Visible去设置,在这里可以去摧毁它;也不用刻意去保存它的一些信息,因为Mogre会把Entity的一些信息保存在内存中,如texture 或mesh,当重新创建Entity时可以找回它的信息,而且,这是比较高效率的方法。然后Name属性是Entity的名字,也是标识,是唯一的。

  SceneNode是一个非常复杂的类,而我们在这里也只会讲一些经常用到及比较重要的。我们可以使用Position去设置或获取SceneNode的位置,而这位置是相对于父级元素的。而我们也可以通过Translate去增加或减下Vectors;AttachObject,在这面我们已经看到过了,用来关联创建模型,NumAttachedObjects,与GetAttachedObject 在复杂模型中是非常有用的,面DetachObject 与DetachAllObjects则是用来删除关联或对象。Scale可以用来缩放Node的大小。

好了,下面我们试一下上面的方法及属性,看看效果,敲入下面代码。

mSceneMgr.AmbientLight = new ColourValue(111);
 
Entity    ent  = mSceneMgr.CreateEntity("Head""ogrehead.mesh");
SceneNode node = mSceneMgr.RootSceneNode.CreateChildSceneNode("HeadNode");
node.AttachObject(ent);
 
node.Scale(0.5f12);
 
Entity    ent2  = mSceneMgr.CreateEntity( "Head2""ogrehead.mesh" );
SceneNode node2 = mSceneMgr.RootSceneNode.CreateChildSceneNode("HeadNode2"new Vector3(10000));
node2.AttachObject(ent2);
 
node2.Scale(121);


与一开始我们的代码不同的是,我们只是缩放了大小,不过运行的效果是挺奇怪的,因为Entity被我们拉伸了。 

最后,我们要讲的是旋转,Rotation 。

我们可以通过Yaw,Pitch和Roll方法去旋转对象,参数可以用Degree为单位或Radian。其中,Yaw是旋转Y轴,Pitch是绕C轴旋转,而Roll是绕Z轴旋转。