C++面向对象编程OOP
面向对象的三个特点
面向对象编程将世间万物抽象出概念,具有封装、继承、多态的特点。
(其实个人感觉,面向对象与黑格尔的哲学思想很接近,不知道提出面向对象编程思想的老先生是不是收到了黑格尔的影响)
抽象
将一类对象的共同属性、行为、功能进行概括,总结成类。
封装
将抽象的数据、代码进行打包管理,放置于类中,提供合理的访问接口。
继承
在已有类的基础上进行对属性、行为、功能描述的拓展。
C++继承
多态
名称相同但实现不同功能的方式。
分为静态多态和动态多态两种,静态多态通过重载函数和泛型编程实现,动态多态通过虚函数实现。
C++多态
Unity_DerekBehaviourTrees
前言
**有限状态机(Finite State Mechine,FSM)与行为树(Behaviour Trees)**是常见的两种控制游戏角色行为逻辑的方式。
FSM将走、跑、跳、攻击、受击等状态不假区分的放到一起并进行逻辑连接,实践中需要我们维护一个当前状态,并时刻更新该状态的逻辑。对于简单的少数的状态,FSM是适用的。但如果状态间的切换逻辑复杂,FSM就会变为“蜘蛛网”,难以维护。
下面是我实现的FSM(“没写博客呢,正在施工中。。。”);
对于复杂的行为,最好使用行为树。行为树正如其名,它会向层次遍历树一样从根节点开始依次判断每个节点是否符合要求,对于符合要求的节点,我们会执行这一节点下的行动节点。
下面参考文章:“游戏AI行为决策方法——行为树”,实现自己的行为树组件(没有全抄)。
行为树(Behaviour Trees)
如上图所示,一棵行为树包含根节点、动作选择节点(组合节点)、动作节点、修饰节点这几部分。
理解行为树
动作节点
动作节点记录简单的基础行为,支持自定义。
修饰节点
特殊的节点,只包含一个子节点。
有两种修饰节点:
取反节点 Inverter
重复执行节点 ...
C++中的智能指针
书接上文!
C++中的指针
内存泄露问题
1234567891011121314151617181920class MyObject{public: MyObject() { cout<<"Create MyObject Object"<<'\n'; } ~MyObject() { cout<<"Delete MyObject Object"<<'\n'; }};int main(){ MyObject* obj = new MyObject(); //delete obj; return 0;}
输出:
1Create MyObject Object
智能指针
智能指针帮助我们自动释放不再使用的内存,从而避免内存泄漏问题。
C++98中加入了auto_ptr
C++11中auto_ptr更新为u ...
C++中的指针
什么是指针
指针表示存储某一对象(通常是变量、函数等)的内存地址。
普通指针
指针与变量
符号&表示引用,变量名左侧的&表示取该变量的地址。
符号表示解引用,变量名左侧的表示取该变量的值。
声明一个变量在类型名右侧用*表示声明该类型的指针。
1234567891011121314151617181920212223int main(int argc, char* argv[]){ std::cout<<"---------指针---------"<< '\n'; int *pc, c; c = 5; cout << "Address of c (&c): " << &c << endl; cout << "Value of c (c): " << c << endl << endl; pc = &c; ...
C++STL的优缺点以及应用场景
STL的六种基本组件
STL(Standard Template Library)是支持C++泛型的标准模板库,为用户提供了一些常用的数据结构及算法,包括链表、队列、集合等。STL包括六种基本组件:容器、迭代器、仿函数(也称 函数对象)、算法、适配器以及分配器。
个人理解上不妨把STL的种种概念看成将一堆文件放到一个抽屉柜中。抽屉柜(容器)有着各种款式,每种款式的抽屉格(迭代器)的排列顺序、大小都不一样(向量、链表、映射、集合等)。我们需要将一堆文件(程序运行中需要处理的数据),放入到抽屉格(迭代器)中。同时为了让文件更加有序,我们还需要对不同抽屉格中的文件的一些信息进行比较,然后按要求排列好顺序(算法)。
容器 Container
容器提供了各种数据结构,决定了数据之间的存储关系。容器分为序列容器(Sequence Container)和关联容器(Associative Container)两类,序列容器包含向量(vector)、链表(list)、数组(array)、队列(queue)、栈(stack)等,关联容器主要包含集合(set)、映射(map)等。使用容器可以帮助更好地标准化 ...
C/C++ 基础汇总
前言
鄙人进入大学后才正式学习编程,加之中国传媒大学的计算机课程安排凌乱结课要求低,因此基础知识仍然不成体系不够扎实。故写一写博客用于输出学到的内容,整理面试时被问到的问题。
往期内容
C++面向对象编程OOP
C++中的指针
C++中的智能指针
C++STL的优缺点以及应用场景
C++STL常用算法(施工中。。。)
参考资料
中国传媒大学 《面向对象游戏程序设计》 课程PPT
中国传媒大学 《游戏开发程序设计基础》 课程PPT
斯坦福大学 CS106
Chorno的C++课程
常见布料模拟方法 Cloth Simulation
本文整理了布料模拟实践过程中学习到的各种理论方法,记录了实践过程中遇到的问题和解决办法。主要基于Unity完成了基于显示欧拉法和PBD方法的布料模拟,并使用ComputeShader对模拟过程的加速。
实现思路
思路概述
计算机图形学中的物理模拟方法可以笼统概括为三个阶段:初始化阶段,物理模拟阶段,更新数据阶段。
初始化阶段中需要构建物理模型。在开始模拟前需要先理解一块布的结构,一块布中存在结构力、剪切力以及弯曲力(图),根据这一结构特点可构建质点弹簧模型,据此模型计算质点间的相互作用完成模拟。
物理模拟阶段的具体实现方法很多,分为两个主要流派,分别是基于物理的模拟和非物理的模拟。
物理模拟方法以欧拉法为主。在质点弹簧系统中,根据胡克定律计算质点间的力,更新质点加速度、速度、位置。欧拉法具体有显示欧拉法、半隐式欧拉法和隐式欧拉法,区别在于显示欧拉法使用t时刻受到的合力更新t+1时刻的位置,隐式欧拉法使用t+1时刻受到的合力更新t+1时刻的位置,半隐式欧拉法结合显示欧拉法和隐式欧拉法,通过t时刻受到的合力更新更新t+1时刻的速度,使用该速度更新t+1时刻的位置。显示欧拉的方程是线性的,隐 ...
《战神4》中的图形学技术——风场和植被交互系统
简单的风力与植被交互系统
一些基础教程通过自定义顶点着色器实现对植被面片模型的顶点扰动。简单的方法是根据时间对一张噪声纹理进行位移和缩放上的变化。依据遮罩纹理限制顶点变化值,再将变化值附加到原先的顶点位置上,从而实现植被的随风摆动效果。
至于与植被的交互则是需要记录玩家的行动轨迹Render Texture,根据Render Texture的信息对周围植被做出响应。
当然这只是简单的植被材质的实现。在此基础上可以做到更为复杂且看起来真实的效果。但是仅仅简单的方法不能满足角色挥砍武器等动作与植被的交互。同时这种实现方法的植被很容易就会感到重复,为玩家带来的代入感就会降低。
《战神4》中的风力与植被交互系统
风场的表达
结合上面提到的植被交互系统的优缺点,《战神4》制作组提出了明确的目标,需要清晰展现随时空变化风力的变化以及玩家交互。
在深入探讨如何表达风前,我们需要对风有更加深刻的认识。风可以看作一个场,这个场将位置映射到风力,风力自然是有大小和方向的矢量,且这个矢量会随着时间和空间变化。从最直观感受上看,生活中同一个位置的不同时刻风的方向和强弱均在发生变化,而同一时刻的不同位置风力自然 ...
《战神4》中的图形学技术——全局光照
全局光照技术
全局光照的定义
全局光照(Global Illumination,GI)或称间接光照(Indirect Illumination)。GI可以分为直接光照和间接光照两部分,通常要考虑直接受到光源照射的能量和反射光源产生的能量的总和。
为了更好理解和分析《战神》中的全局光照技术,下面先介绍一下GI的技术发展路线。
全局光照的技术发展路线
在光栅化渲染管线中,我们需要将场景中的模型数据准备好后输入顶点着色器中,经过细分曲面着色器、几何着色器、光栅化、片元着色器等操作拿到输出图像。这一过程中并不涉及间接光照。直到光线追踪技术的出现。
光线追踪的思想本质就是从屏幕投射一条光线,光线会经过不断的反射、折射直到打到光源,对物体的着色就是在这一过程中不断积分能量并计算渲染方程。
光线投射(Ray Casting)
光线投射由Arthur Appel在一篇名为《 Some techniques for shading machine rendering of solids》中提出。这是光线追踪的第一步,需要将屏幕空间转换到世界坐标下,然后以每个像素为起点向场景中发射一条光线,并根据与光线相 ...