有趣的进化心理学
0最近在读《进化心理学》,进化心理学是心理学中非常有意思的一个领域,近些年来发展非常快,成果也非常多。通过进化的观点来为人类及其他物种的许多行为和心理偏好寻找解释,是一个非常有趣的解读方式。
通俗的说,所有的物种包括人类的很大一部分行为和心理机制都是在自然选择的过程中被逐步筛选出来的——筛选的原则是这种行为或心理机制是否曾经为该物种的生存或者繁殖提供了某种好处,从而使得持有该基因的个体更容易获得选择优势,并且在繁殖的过程中将这种行为/心理机制的基因传递给了后代。这样,最终延续下来的个体大都保留了该行为方式/心理机制。
简而言之,进化心理学的核心观点可以简述为:自然选择的压力持续作用,种群中的部分个体有某种可由基因操控的行为或者心理机制使其在自然选择的压力下拥有生存或繁殖上的优势,繁殖行为将该基因及其决定的行为、心理机制和可能存在的副产品传递给后代。
人类对蛇有天生的恐惧感,这源于我们祖先在进化过程中生命不断受到蛇的威胁,获得了对蛇的恐惧感的人更好的适应了有蛇存在的环境,从而有更高的几率活下来。但是由于进化机制只能在非常大的时间尺度上起作用——因此现代社会的汽车出现才刚刚100多年的时间,虽然每年丧生于车轮下的人数远远多于丧生于蛇的攻击的人数,但是在短短的几代人的时间里,人类还未能对汽车还未能建立起相应的心理机制。(事实上,如果人类社会的秩序和法律持续发展,遵守秩序和法规可以带来安全性和生存优势的话,也许未来社会的中人类会进化出遵守秩序和法规的心理机制)
简述游戏逻辑及编辑器的抽象
0最近一段时间以来,本人参与了公司下一代游戏编辑器的开发,从而有机会针对编辑器设计做一些简单的思考——如何设计更好的抽象,从而达到在客户端,服务端,以及游戏编辑器中复用尽可能多的代码?如何能够尽可能的缩短游戏设计师(策划)及美术设计师(3D/2D场景美术)的工作流程?市面上优秀的引擎往往都附带有所见即所得编辑器,这样的编辑器应当如何设计?网络游戏编辑器又有哪些可以从中借鉴和学习之处?
将尚不是很成熟的思考结果总结成本文。本人水平所限,许多错漏之处难免考虑不周全,如果有同学对本文所述的问题有任何想法,亦或是有其他文章与此相关,欢迎一起交流。
客户端逻辑的复用
把游戏客户端进行拆解,可以将其看成一个拥有输入、输出及内部逻辑循环的系统。玩家通过鼠标键盘发送消息给客户端,服务器通过网络接口发送消息给客户端,然后客户端于每一帧把当前对应的表现绘制到屏幕上。
客户端输入包括:Windows消息(键盘,鼠标,windows的其他消息,快捷键,定时器,摇杆等),网络消息(通过服务器或者其他玩家发送来的消息);输出包括:屏幕显示,网络消息(发送给服务器的响应或请求)。
事实上一个游戏编辑器也可以简单的看成类似于上述的系统,其输入包括:Windows消息(键盘,鼠标,windows的其他消息,菜单快捷键等,定时器等);输出则包括了屏幕显示,正常情况下编辑器不需要接受或发出任何网络消息(这里指与服务器进行逻辑上的通信,而非指通过版本控制系统进行数据的同步管理)。
实际上编辑器与客户端程序实际上都拥有相似的输入接口(Windows消息),只是同样的消息引发了不同的逻辑——在这里我们可以对输入接口做以抽象,并使用不同的实现来分别实现其逻辑,从而达到在编辑器中拥有热切换编辑状态和游戏状态逻辑的能力。(许多知名的游戏引擎都拥有类似上述的可在编辑器中切换编辑/游戏状态的功能,比如Crysis的SandBox编辑器,再如RunicGames的TorchLight编辑器等)。 (more…)
Hermite Curve 在绘制轨迹中的应用
0
在3D游戏的粒子系统中,往往可能有这样一类需求——伴随着人的动作,一条光带划过,或者伴随着武器的劈砍动作,一条刀光划过。
如果我们简单的在每次Tick的时候采样当前的位置朝向,并创建一截新的面片,往往会形成类似于如下图的粗陋效果:
之所以会产生一截一截的感觉,是由于在每次进行采样的时候,我们只能得到当前时刻的位置信息。因此尽管在从上一次到本次采样的过程中,轨迹实际经过的路程是一条平滑的曲线,可由于每一帧之间的时间不可能小到足够提供平滑曲线的采样精度,我们所能获得的总是一截截的折线。
怎样才能够通过为数不多的关键点,创造出一条平滑的曲线来呢?
Charles Hermite 提出的Hermite Curve解决了上面的问题。通过一系列的三维空间关键点,可以得到每个点处的切线,再经过Hermite Base Function的多项式计算,则可以得到插值点。
如图:
设P1,P2为平面上的两个点,T1,T2为两点处的切线,由点及点的切线,Hermite Spline就可以给出一个平滑过渡的曲线。
Hermite Base 多项式的参数如下表,其中t是从上一个点到当前点的插值系数。上一个点处为0,当前点为1。
Ogre在其Ogre::SimpleSpline类中实现了HermiteCurve。感兴趣的同学可以做以参考。
| expanded | factorized | |
| h00(t) | t3 − 3t2 + 1 | 1 + 2t)(1 − t)2 |
| h10(t) | t3 − 2t2 + t | t(1 − t)2 |
| h01(t) | − 2t3 + 3t2 | t2(3 − 2t) |
| h11(t) | t3 − t2 | t2(t − 1) |
事实上,上述做法也不过就是对Hermite Curve类型的样条曲线的利用而已。样条曲线实际上并不陌生,贝塞尔曲线就是一种我们关注最多的样条曲线。尽管其不适用于我们前述的场合——原因是贝塞尔曲线通过控制点计算出的曲线并非一条依次经过控制点的曲线。如下图所示(图片来源于:http://escience.anu.edu.au/lecture/cg/Spline/printCG.en.html):
参考资料:
1. Hermite Curve Interpolation. Hamburg (Germany), the 30th March 1998
windows的消息队列与消息循环#1
9在Windows操作系统中,窗口是一种User Object,隶属于创建它的线程。如果创建窗口的线程结束,则操作系统会自动删除窗口。建立窗口的线程,必须是为窗口处理所有消息的线程,如果你创建了一个后台线程,希望更新界面,那么只能通过消息的形式去通知窗口,并由拥有窗口的线程在窗口的消息处理函数中做出处理。
1、Windows的消息队列与消息循环
所有创建了窗口的Windows程序,都需要运行一个消息循环,我们在无数的Windows编程书籍中都可以看到这样的经典代码:
1: while (GetMessage(&msg, hWnd, 0, 0) > 0)
2: {
3: TranslateMessage(&msg);
4: DispatchMessage(&msg);
5: }
这里的hWnd就是创建的窗口句柄,上述循环会不断的把该窗口(hWnd)相关的消息取出来,并分发到消息处理函数当中。
GetMessage函数是用来获取当前线程消息队列当中的消息的,其中的第二个参数如果传递一个窗口句柄,那么就会获取该窗口相关的消息,如果传NULL,那么会将线程消息队列中所有的消息都取出来。如果创建了多个窗口,而只对其中一个窗口句柄调用GetMessage形成消息循环,那么别的窗口都会毫无响应。
这里需要补充说明一个概念:消息队列是操作系统为每个需要处理消息的线程创建的,任何线程只要调用过与消息有关的函数(如,GetMessage,PeekMessage),操作系统就会为该线程创建消息队列。可能有人会问,那没有窗口的线程,操作系统也有必要为其创建消息队列么?这是有可能的,因为我们可以通过诸如PostThreadMessage的Api向别的线程或者本线程发送消息,如果目标线程没有消息队列,会导致这个函数返回失败。 (more…)
认识预设信念与自我纠错
0预设信念与自我纠错
-读《社会心理学》
我们如何认知客观事物?我们的感觉忠实的反应出世界的原貌吗?并非如此。我们总是带着偏见去看这个世界的。
每个人都有自己预设的观念,所有的外界信息,在进入大脑之后,并非呈现为对外界客观事实的真实表现,而是与我们预设的观念相结合,亦或是被我们预设的判断所过滤,成为我们对外界事实的解释而被记忆。有箴言曰:“客观事实确实存在,但是我们都是通过信念和价值观的眼镜去观察他们”。因此当外界事件发生时,我们所作出的反应并非针对“事件本身”的反应,而是针对我们“对事件的解释”而做出的反应。
价值观是什么:“这是什么”与“这应该是什么”之间的差别就是我们的价值观。换句话说,我们从对事实的客观描述偏转到对“应该如是”的说明陈述时,我们就纳入了自己的价值观。 (more…)