自然法则
虚拟世界的物理建立在真实世界的物理之上。这自有道理。
我推一扇门,门就开了。我推一扇虚拟的门,那扇虚拟的门就开了。我同样可以轻松地规定成:我推一扇虚拟的门,就会有虚拟的鸟从一只虚拟的杯子里飞出来。除非那扇门被标记为“不是普通的门”(No Ordinary Door)、那只杯子被标记为“不是普通的杯子”(No Ordinary Mug),否则这会把人搞糊涂。为什么?因为人从小就学会了支配现实如何运作的那些因果规则。在虚拟世界里,除非刻意为之,否则他们无法阻止自己去套用这同一套规则。因此对虚拟世界来说,任何干扰这套规则的东西都会构成一次情境之外的打断;任何遵循这套规则的东西,都在默默支撑着“虚拟即真实”这一错觉。
真实世界遵从物理定律运行。人们为了模拟物理定律而在头脑中建立起来的那些规则 1 要简单一些,但对于几乎所有实际用途来说都够用了。因此,想让玩家信服的虚拟世界,至少必须实现这些规则(而且,说来矛盾,也许不必实现更多;我们在这里要说服的是玩家,不是现实)。
所以从根本上说,虚拟世界的物理所关心的,就是把那些显而易见的东西实现出来。
关键在于透明。透明意味着玩家不必刻意搁置怀疑,因为他们的感官让这些信息径直通过,不作任何评论。设计者在营造透明上越成功,他或她的工作就越不为人所注意:这对沉浸来说是好事,对设计者的自尊心来说就不那么好了。
玩家对虚拟世界物理的预期,只要情境合适,并不一定要直接对应现实。最显眼的例子,是一个自有一套物理学的类型:卡通。在卡通里,你跑出悬崖边缘之后并不会掉下去,直到你意识到自己跑出了悬崖边缘。自然法则仍然适用,只是方式不同 2。只要人们接受了这套虚构设定,它就能成立。《卡通城》可以像《无尽的任务》一样有沉浸感。
虚拟物理的核心问题,是它运行在什么样的细节层次上。
我松手放开一个物体,它就会往下掉。这就是重力在起作用。它撞到地面时,会弹起来吗?会受损,也许会摔坏吗?也许是地面坏掉?如果地面是斜的呢?物体会顺着它滚下去吗?这取决于物体的形状、它的质量、它由什么材料做成、地面由什么材料做成,等等。如果有风,又会产生什么影响?
如果我丢下的物体和地面之间还隔着另一个物体,又会怎样?它会把物体接住,还是让它穿过去;物体是会被弹开,还是从里面弹出来?我可以把苹果丢进柳条筐里,但在装满之前能装下多少个?就算筐满了,装不下苹果了,我还可以往里加沙子。然后我还可以加水,水会在里面留上一小会儿,但最终会渗漏出去。也许,如果我在沙子里再加上水泥粉,它反倒会凝结起来。
这还只是开头。虚拟世界的物理必须处理各种各样的问题,而这些问题在真实世界里是不费吹灰之力就实现的。一根羽毛从窗口掉下去,要多久才落地?我的指南针为什么指向北方?我拿手电筒照镜子,会发生什么?冰能保持多久?我朝一群人泼一桶水,谁会淋湿?我能把书架拆开,拿这些部件做一只木筏吗?如果我放火烧一栋木房子,会怎样?
真实世界能回答所有这些问题,因为它就是这么运作的。它有分子、原子、原子粒子、夸克,还有天知道什么别的东西,全都在至少四种力 3 的作用下协同工作。虚拟世界别指望能跟真实世界的物理一较高下。遗憾的是,正如上面的例子所示,虚拟世界目前也还应付不了朴素物理学(naïve physics)。
话虽如此,如今的虚拟世界可以调用的计算资源比过去更多,因此推测它们可以拥有更好的物理,也不算离谱。在建模工具已经能做实时光线追踪、流体力学、布料变形和表面摩擦效果的今天,虚拟世界却很少费心去实现“把这个东西丢进水里,它会沉下去”这样简单的概念,这有点令人伤感。
能做到的事情有实际的限度。随着细节增加,活动组件的数量会增加,组件之间的交互数量则呈指数增长 4。往这个问题上再堆多少台计算机,也不会有丝毫改善。话虽如此,如果《MUD2》能让你从井口把一个物体丢下去,落进一条地下暗河,河水把它冲走,直到它撞上一个也许会、也许不会把它拦住的格栅——而这全程还要计算物体的密度、撞击损伤、水浸损伤,以及撞到别人或被别人抓住的可能性——那么一个大规模的图形化虚拟世界没有理由做不到更好。诀窍不在于实现全部物理,甚至也不在于实现全部朴素物理学,而在于实现刚好够用的朴素物理学,以满足玩家对细节的感觉。
这仍然比听起来要难。
虚拟世界是在命令这一层上运作的。玩家在决定自己想做什么时,用的是一组组实际上不可再分的操作,这些操作就构成了命令集。他们想穿上一双靴子,可不想(对每只靴子都)先松开鞋带、把脚套进去、拉紧鞋带,然后再打一个双结。在现实生活中大多数人想都不用想就能做到的简单目标,在虚拟世界里也应当照此实现。信不信由你,为《MUD1》做设计时,罗伊和我确实讨论过这些问题,然后才决定把动作切在哪个粒度上。这就是我们选择 “unlock door”(开锁)、而不是 “put key in door; turn key; remove key from door”(把钥匙插进门;转动钥匙;从门上拔出钥匙)的原因。这也是我们把 “lock”(锁)和 “door”(门)做成同义名词的原因。
要实现物理,你其实只需要比最深的命令再往下一个概念层级。比这更深的东西,玩家反正也看不见。如果一个角色能射出一支箭,虚拟世界引擎就应当能呈现箭的飞行,并让它的到达不是瞬间完成的;不过,这不必靠把牛顿定律套用到抛物线轨迹上来实现——它只需要看起来像是那样做的就行。
有一种观点认为:如果更深的物理模型比更浅的模型复杂度更低,或者可以拿它构建出若干个复杂的浅层模型,那就可以采用更深的模型 5。比如说,如果你为了实现虚拟网球游戏,已经建好了一个不错的牛顿力学模拟器,那不妨把它也复用到射箭上。这很合理——前提是你确实需要那个模拟器来做网球。在实践中,程序员比设计者更容易往深处走得太远:你也许只是规定了角色的呼吸在寒冷的空气中应当可见,但要花上 10 天去实现一个绝妙的涡流计算新例程的人,并不是你。
那么,总结一下:
玩家头脑里已经“编译”进了一套对真实世界如何运作的感觉。
虚拟世界如果模仿这一点,对沉浸有极大的帮助。
玩家很少需要想到“直接就能做”以外的层次。
命令就应当写在这一层次上。
物理通常只需要构建在这一层次再往下的那一层。
问题在于:很多时候,物理根本没写到这下一层附近,甚至压根就没写。
既然如此,设计者可选的应对方式并不多。按从最糟到最好的顺序,分别是:
硬扛。虚拟世界里有池塘;玩家可以在池塘的水面上行走;有什么大不了的。
条件反射式的应对。玩家没法走进池塘,却没有任何情境之内的理由。
消除症状。玩家没法走进池塘,因为池塘里住着的凶恶鱼群会拦住他们。这给出了一个情境之内的理由,但它总是很牵强。
掩盖裂痕。这个虚拟世界里根本没有池塘。
实现物理。走进池塘的角色可以站在水里,水漫过膝盖,并如预期那样浸湿衣服。
玩家的命令蕴含着虚拟世界的物理。因此,设计者在决定要实现哪一层次的物理时,应当去看命令。
这些规则被称为朴素物理学(naïve physics),是定性推理(qualitative reasoning)的一个例子。帕特里克·J·海斯(Patrick J. Hayes),《朴素物理学宣言》(The Naïve Physics Manifesto)。唐纳德·米基(Donald Michie)编,《微电子时代的专家系统》(Expert Systems in the Micro-Electronic Age)。爱丁堡,爱丁堡大学出版社,1978。约翰·德·克莱尔(Johan de Kleer),《经典力学中的定性与定量推理》(Qualitative and Quantitative Reasoning in Classical Mechanics)。帕特里克·H·温斯顿(Patrick H. Winston)与理查德·H·布朗(Richard H. Brown)编,《人工智能:MIT 的视角》(Artificial Intelligence: an MIT Perspective)。马萨诸塞州剑桥,MIT 出版社,1978。 ↩︎
见《卡通物理学定律》(Cartoon Laws of Physics),它有好几个版本。http://funnies.paco.to/cartoon.html 与 http://www.bbc.co.uk/dna/h2g2/alabaster/A645095。 ↩︎
引力、电磁力、强核力、弱核力。也许还有别的力尚未被发现。 ↩︎
潜在 exploit 的数量也是如此。 ↩︎
虚拟世界的物理本身就可以看作实现更高层效果的一个模型。一致性从中受益:如果你能让物理去处理某个既定的桥段,通常比你为它单独硬编码要好。 ↩︎