09 2013 档案
摘要:重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。这是通过重载类的operator()来实现的。 函数对象更重要的作用是实现函数回调,可以替代指针实现函数回调。定义如下:struct int_max{ int operator()(int x,int y) { return x>y?x:y; }}; 调用时生成一个对象: int_max int_max1; ...
阅读全文
摘要:STL中算可以分为三种, 1、变序型队列算法,可以改变容器内的数据; 2、非变序型队列算法,处理容器内的数据而不改变他们 ; 3、通用数值算法,这涉及到很多专业领域的算术操作,这里不做介绍。 第一是变序型算法,这种算法可以改变容器内的数据,而且可以只对容器的一部分数据进行操作。常用的有copy,reverse,swap,replace等,用法如下: 首先看看copy函数,是将某一范围的数据拷贝到新的容器中_OutIt copy(_InIt _First, _InIt _Last,_OutIt _Dest); // copy [_First, _Last) to [_Dest...
阅读全文
摘要:栈stack 、队列queue 和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现。 stack 先进后出 queue 先进先出 priority_queue 按优先级出队 代码示例如下: 1 #include "iostream" 2 using namespace std; 3 #include "string" 4 #include "stack" 5 #include "queue" 6 7 i
阅读全文
摘要:Maps是一种关联式容器,包含“关键字/值”对。Multimaps和maps很相似,但是MultiMaps允许重复的元素。 简单介绍:1、声明,首先包含头文件 “map” map test1,test2;// map ::iterator it1,it2;//迭代器 multimap test3; multimap ::iterator it3;2、插入数据,可使用三种方法: 第一种,使用pair函数 test1.insert(pair(1,"song")); test1.insert(pair(2,"zhang")); test1.insert...
阅读全文
摘要:集合(Set)是一种包含已排序对象的关联容器。多元集合(MultiSets)和集合(Sets)相像,只不过支持重复对象,其用法与set基本相同。 用法介绍 1.insert()函数 首先把头文件set包含进去#include "set" set test1; set ::iterator it1; multiset test2; multiset ::iterator it2; ////////////////////////////////////////////////////////////////////////// //输入 it...
阅读全文
摘要:cegui配置整了好长时间了,在一位大牛帮助下终于搞定了,网上的教程大多是老版本的,cegui-0.8.2版的配置寥寥无几,现在总结一下,献给正在纠结的小白们。 准备工作 第一步,先下载cegui-0.8.2和CEGUI 0.8.x Dependency http://www.cegui.org.u
阅读全文
摘要:建立自己的Ogre程序一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方。 首先,我们新建一个win32空项目 然后配置环境 最后新建define.cpp、define.h、main.cpp具体过程如下第一,在define.h中包含头文件,这里需要Orge.h文件,然后添加如下代码#include "Ogre.h"class MyApplication{public:MyApplication();~MyApplication();void go();protected:bool setup();//设置环境void setu
阅读全文
摘要:这一节练习一下手动创建实体,用到了对象(ManualObject) 第一,依然是模板#include "ExampleApplication.h"class Example1 : public ExampleApplication{public: void createScene() { }protected:private:};#include INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ){ Example1 app; app.go(); ret...
阅读全文
摘要:BSP(binary-space partitioning) Scene Manager(二叉空间分割)场景管理器比较适合用于室内场景。第一,添加框架代码如下 1 #include "ExampleApplication.h" 2 class Example1 : public ExampleApplication 3 { 4 public: 5 void createScene() 6 { 7 } 8 protected: 9 private:10 };11 12 #include 13 INT WINAPI WinMain( HINSTANCE hInst...
阅读全文
摘要:今天按照网上的教程配置CEGUI, 一直运行不了,不明白原因,而后又出现了错误LNK1104: 无法打开文件“OgreGUIRenderer_d.lib”,经过反复检查,排除包含目录问题。 不过可能是教程有点老,我在CEGUI的lib文件夹下发现根本没有这个文件,倒是有个类似的文件CEGUIOgreRenderer_d.lib。原来不同的版本,生成的文件也不同,真是害苦了我们初学者啊总结如下: 首先添加包含目录 .......\include\CEGUI 然后添加 .......\Samples\Common\CEGUIRenderer\include 最后添加.......\S...
阅读全文
摘要:前几天设置天空盒时一直出问题,现在问题终于解决了,问题来的莫名其妙,走的也莫名其妙。 第一,还是框架,我们依然使用ExampleApplication文件,框架如下 1 #include "ExampleApplication.h" 2 3 class TutorialApplication : public ExampleApplication 4 { 5 protected: 6 public: 7 TutorialApplication() 8 { 9 }10 11 ~TutorialApplication() 12 {13 }14 p...
阅读全文
摘要:以上一节为蓝本,这里增加一点难度,添加了四个节点,增加键盘控制移动速度,使用bool变量控制是否移动。 第一,要增加键盘控制,那就使用OIS::KeyListener,在监听器里添加一个父类KeyListener,添加成员变量并初始化 其中构造函数的ExampleFrameListener(win,cam,true,false);第三个参数改为true,表示使用带缓冲的键盘输入。 1 MoveDemoListener(RenderWindow *win,Camera *cam,SceneNode *sn,Entity *ent,std::deque &walk) 2 ...
阅读全文
摘要:学了那么长时间,才学会跑起来。My Ogre,动起来。 第一,还是要把框架搭起来,这里我们用到双端队列deque,前面已经简单介绍过,头文件如下:#include "ExampleApplication.h"#include "deque"using namespace std; 第二,是我们的监听器,继承至ExampleFrameListener,构造函数我们使用五个参数,分别为渲染窗口,摄像机,场景节点,实体,行走路线上的位置坐标。1 MoveDemoListener(RenderWindow *win,Camera *cam,SceneNode *
阅读全文
摘要:今天做项目时,直接拷贝了另一个工程里的头文件和源文件,然后运行时就出现这种问题,莫名其妙,在原程序里运行一点问题就没有,但是在新工程里就是error。1 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(216): error C2065: “ColorMatrix”: 未声明的标识符2 1>e:\c++\button_fly2\button_fly2\gdipbutton.cpp(216): error C2146: 语法错误: 缺少“;”(在标识符“HotMat”的前面)3 1>e:\c++\button_fly2\butto
阅读全文
摘要:看这一节,是为了下一节的使用,在ogre3d里有些操作要使用到deque。C++ Deque(双向队列) 的使用 Deque结合了vector 和list 优缺点,是一种使用简单的容器。 deque 的特点: (1) 随机访问方便,即支持[ ] 操作符和vector.at() ,但性能没有vector 好; (2) 可以在内部进行插入和删除操作,但性能不及list ; (3) 可以在两端进行push 、pop ; (4) 相对于verctor 占用更多的内存。 常用的函数和list的基本相同,除了个别的几个,如 1、创建一个新双向队列 ,构造函数很...
阅读全文
摘要:最近项目需要实现按钮的动态效果,多方学习,现在终于能实现一些功能了。过程如下: 第一,新建一MFC对话框应用程序。 第二,删除自带按钮,并添加两个按钮,button1,button2,ID为IDB_BUTTON1,IDB_BUTTON2.同时响应鼠标单击按钮事件。如下void Cbutton_fly3Dlg::OnBnClickedButton2()//video2{ // TODO: 在此添加控件通知处理程序代码 MessageBox(L"video2");//这里简单测试一下} 第三,添加位图资源,在资源视图下添加几张图片,如下图 第四,设置按钮参数OwnerDraw为
阅读全文
摘要:这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头。 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListener,另一个我们也刚学过KeyListener。 好吧,开始。 首先我们声明一个宏,#define CAMERA_NAME "SceneCamera" ,这是我们要使用的摄像机常量,下面要多次使用。 然后我们定义两个全局函数,void setupViewport(RenderWindow *win, SceneManager *curr){ win->removeAll
阅读全文
摘要:List --- 双向列表 List是线性列表结构,数据查找需要一个接一个,不能直接得到元素地址,检索时间与目标元素的位置成正比。但是插入数据比较快,可以在任何位置插入数据或者删除数据。list特点是: (1)不使用连续的内存空间这样可以随意地进行动态操作; (2)可以在内部任何位置快速地插入或删除,当然也可以在两端进行push和pop 。 (3)不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() ;大多数函数和vector的类似,这里就不解释了,有几个不一样的如下: merge() 合并两个list --- 链接之后会把第二个链表删除掉 void merg...
阅读全文
摘要:C++STL(Standard Template Library)标准模板库是通用类模板和算法的集合。包含一些标准的数据结构的实现如queues(队列),lists(链表),stacks(栈)等。STL提供了以下三类数据结构的实现: 标准容器类:顺序性容器vector从后面快速插入和删除,直接访问任何元素deque从前面或后面快速插入和删除,直接访问任何元素list双链表,从任何地方快速插入和删除容器适配器statck后进先出queue先进后出priority_queue最高优先级元素总是第一个出列关联容器set快速查找,不允许重复值multiset快速查找,允许重复值map一对多映射,基于.
阅读全文
摘要:设计模式很多,但是常用的并不多,下面是一些常用的,总结一下,具体内容请Google。1、观察者模式 观察者模式定义了对象之间的一对多关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。发生改变的对象称之为观察目标,而被通知的对象被称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以可以根据需要增加和删除观察者,使得系统更加易于扩展。观察者模式又称为发布-订阅模式。2、装饰者模式 动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。装饰者模式比生成子类更为灵活。3、简单工厂模式 简单工厂模式又称为静态工...
阅读全文
摘要:用文件来记录 Ogre 系统初始化、运行、结束以及调试信息。使用日志便于我们调试程序。Ogre 日志系统由两个类组成:Log 类与 LogManager。 1、Log类 Log 类的一个对象对应于一个日志文件,log类中含有成员函数logMessage()负责向文件中填入信息。1 void logMessage(const String& message, LogMessageLevel lml = LML_NORMAL); // 第一个参数就是要写入的信息,第二个参数代表这条信息的重要程度,分三种参数值重要程度LML_TIVIAL最低LML_NORMAL一般LML_CRITI...
阅读全文
摘要:带缓冲的鼠标、键盘操作,这里的鼠标、按键事件会被各自的监听器捕获。其中OIS中定义的两个类MouseListener,KeyListener负责对事件的处理。我们需要使用这两个类的接口。 当一个键被按下时,会触发一个 KeyListener::keyPressed 事件,而当这个键被释放(不再按下)时,KeyListener::keyReleased 事件被触发给所有已注册的KeyListener 类。 鼠标键被按下/释放的函数: MouseListener::mousePressed 和MouseListener::mouseReleased. 它还包含一个 mouseMoved ...
阅读全文
摘要:要实现键盘,鼠标对场景的控制,首先要帧监听,就是在每一帧的渲染前后对它进行操作。这里的操作没有用到缓冲区,只是简单的直接获取。 1、这些步骤和前面的一样,直接上代码,操作还是在createScene函数里。代码如下: 1 void createScene() 2 { 3 //载入实体 4 mSceneMgr->setAmbientLight(ColourValue(0.25,0.25,0.25));//设置环境色 5 Entity *ent1 = mSceneMgr->createEntity("ninja","ninja.me...
阅读全文
摘要:这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光。具体内容前面说过,这里就不解释了。 继续在上一章的程序的基础上实现。 1、创建摄像机(Camera) createCamera()函数是继承自ExampleApplication的虚函数,把它实现了。 1 class Example1:public ExampleApplication 2 { 3 public: 4 //..........其他代码 5 virtual void createCamera() 6 { 7 mCamera = mSceneMgr->createCam...
阅读全文
摘要:资源管理 可管理的资源有: 材质资源:在.material文件中包含的材质脚本定义(技术、通路、纹理单元等数据的定义)。 模型资源:经过优化的二进制网格模型文件,扩展名为.mesh。包含几何信息和一些动画数据。 骨骼资源:经过优化的二进制骨骼文件,扩展名为.skeleton。包含骨骼动的数据以及相应帧动画的信息。 字体资源:字体的配置信息,扩展名为.fontdef的文件,其中包括TrueType字体的引用以及其他字体配置数据。 GPU程序资源:在.program中对GPU程序的声明信息,与材质脚本.material文件有类似的结构,但Ogre保证所有.program文件都会在处理材...
阅读全文
摘要:接着上篇写http://www.cnblogs.com/songliquan/p/3294902.html 旋转这里有必要看一下关于旋转的源代码: virtual void pitch(const Radian& angle, TransformSpace relativeTo = TS_LOCAL); virtual void yaw(const Radian& angle, TransformSpace relativeTo = TS_LOCAL); virtual void roll(const Radian& angle, TransformSpace rela
阅读全文
摘要:SDK安装以及编译1、下载SDK,地址如下 http://www.ogre3d.org/download/sdk2、安装SDK,直接解压到相应目录,如D:/ogreSDK3、我用的是1.8版本,打开SDK安装目录,如图: D:\Program Files\OgreSDK_vc10_v1-8-1 用VS2010打开ogre.sln对其进行生成解决方案,过程有点慢,如果没有出问题,那就可以进行下一步了。 4、打开D:\Program Files\OgreSDK_vc10_v1-8-1\bin\debug下面的SampleBrowser_d.exe,就可以进入Sample 创建项目并...
阅读全文
摘要:物体着色的基础 --- 四种不同光照作用 1、环境反射 近似的模拟了场景中的全局辐射,也就是用来近似模拟所有光在场景中不断散射的结果。材质中有相应的属性来代表这种环境反射颜色。 2、漫反射 这种颜色是接收到直接从光源发射的光之后产生的,“漫反射”和现实中的意思一样,就是描述光被物体反射到多个方向的效果。 3、放射 指的是自发光物体所拥有的颜色。具体意思就是放射光只能照亮自己却不能对周围任何物体产生影响。这种光很奇怪的,现实中没有的。 4、镜面反射 描述了物体对被光照后的“高光”效果。这个也比较抽象。纹理贴图(Texture Mapping) 可以用程序把纹理通过一个独立的坐标...
阅读全文