随笔分类 - C++
摘要:今天做项目时,直接拷贝了另一个工程里的头文件和源文件,然后运行时就出现这种问题,莫名其妙,在原程序里运行一点问题就没有,但是在新工程里就是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) 可以用程序把纹理通过一个独立的坐标...
阅读全文
摘要:场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World)、父节点空间(Parent)以及本地空间(Local)。1、世界空间 就是物体所存在的地方,当我们把一个模型放进世界模型里面去,那么它就有了一个世界坐标,这个世界坐标是用来标记世界中不同的模型所处的位置的。在世界空间里,世界的中心就是远点(0,0,0)。而在ogre中,这个也相当于场景根节点的位置,所以世界空间在ogre中也可以理解为“相对于场景根节点”。世界空间也意味着用全局的X,Y,Z坐标。 父节点空间变换是相对于一个节点的父节点,也就是把父节点的坐标作为变换空间的矩阵原点。本地空间变...
阅读全文
摘要:ogre的使用方法1---自动设置1、ogre初始化:首先实例化一个Root对象1 Root * root = new Root();2 Root * root = new Root("plugins.cfg"); 3 Root * root = new Root("plugins.cfg", "ogre.cfg");4 Root * root = new Root("plugins.cfg", "ogre.cfg", "ogre.log");//系统默认这样,当你没有填写参
阅读全文
摘要:五、阴影 阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系。 启用阴影: 缺省情况下,阴影是关闭的,开启方式如下: 1、建立场景时就设置阴影技术有效 --mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE); 2、创建一个或者多个光源 3、关闭那些不需要投射阴影的物体,可以用物体的aetCastShadows(false)来实现。 4、设置投影的最远距离,通过SceneManager::setShadowFarDistance来限制投影的最远距...
阅读全文
摘要:三、网格工具(Mesh) 1、导出器(Exporters)---用于从模型生成器中得到数据并且导入到OGRE中去。 导出器是指通过3D模型工具的插件写成网格数据和骨骼动画的文件格式可以在OGRE中被实时渲染(这句话读着太吃力了)。这些文件被导出器以.mesh和.skeleton形式生成。 2、XML转换器(XmlConverter)---用于从XML转换网格数据和骨骼数据 。 格式:OgreXMLConverter sourcefile [destfile] 3、网格数据更新器(MeshUpgrader)---用于从OGRE其中之一的版本更新二进制网格数据到其他的版本中。 格式:O...
阅读全文
摘要:9、粒子脚本 粒子脚本允许你实例化地在你的脚本代码中定义粒子系统,而不必在源代码中进行设置,使得你做任何修改都能得到快速回应。脚本里定义的粒子系统被用作模板,并且多个实际的系统可以在运行时从这里被创建。 粒子系统属性: quota ---设置这个系统在某一时刻所允许包含的最多粒子数。 格式: quota material ----设置这个系统中的全体粒子将要使用的材质的名字。 格式: material particle_width ---在世界坐标中,设置粒子的宽度。 格式: particle_width particle_height ---在世界坐标中...
阅读全文